递归解决八皇后回溯算法

ゝ一世哀愁。 2023-07-08 02:51 23阅读 0赞

问题简述:八皇后问题是一个古来而著名的问题,该问题是19世纪著名的数学家高斯同学提出来的。在8*8的国际象棋上摆放八个皇后,使其不能互相的攻击,也就是说,任意的两个皇后不能放在同一行或则是同一个列或者是同一个对角线上,问有多少个摆放的方法

代码:

  1. package com.yg.recursion;/*
  2. @author GeQiLin
  3. @date 2020/2/24 20:30
  4. 求解8皇后问题
  5. */
  6. public class Queen8 {
  7. /*
  8. * arr[i]=value代表第i+1个皇后在第value+1个位子,
  9. * */
  10. private int MAX=8;
  11. private int[] arr=new int[MAX];//存放皇后的位置
  12. private int count=0;
  13. public static void main(String[] args) {
  14. Queen8 queen=new Queen8();
  15. queen.check(0);
  16. System.out.println("共有"+queen.count+"种摆法");
  17. }
  18. //放置第n个皇后
  19. private void check(int n){
  20. //此时8个皇后已经存放完成,应为n是从0开始
  21. if(n==MAX){
  22. printfArr();
  23. return;
  24. }
  25. /*
  26. * for循环作用
  27. * 1.冲突时,用于移动位置使得不冲突
  28. * 2.不冲突时配合递归,可以依次摆放下一个皇后的位置
  29. * 3.当出现一种摆法后,从最后一个皇后的位置开始改变尝试新的摆法
  30. * */
  31. for (int i = 0; i <MAX; i++) {
  32. arr[n]=i;//用于移动皇后的位置
  33. if(!judge(n)){
  34. //不冲突,摆放下一个皇后
  35. check(n+1);
  36. }
  37. }
  38. }
  39. /*
  40. 判断是否冲突
  41. * 每一个皇后不能在同一行,同一列,同一斜线
  42. * n为第几个皇后
  43. * */
  44. private boolean judge(int n){
  45. //判断地n个皇后与前面第n+1个皇后位置是否冲突
  46. for (int i = 0; i < n; i++) {
  47. //判断是不是在同一列,或者一条斜线上
  48. if(arr[i]==arr[n] || Math.abs(i-n)==Math.abs(arr[i]-arr[n])){
  49. return true;
  50. }
  51. }
  52. return false;
  53. }
  54. //打印皇后位置
  55. private void printfArr(){
  56. count++;
  57. for (int i = 0; i < MAX; i++) {
  58. System.out.print(arr[i]+" ");
  59. }
  60. System.out.println();
  61. }
  62. }

发表评论

表情:
评论列表 (有 0 条评论,23人围观)

还没有评论,来说两句吧...

相关阅读

    相关 解决皇后回溯算法

    问题简述:八皇后问题是一个古来而著名的问题,该问题是19世纪著名的数学家高斯同学提出来的。在8\8的国际象棋上摆放八个皇后,使其不能互相的攻击,也就是说,任意的两个皇后不能放在