用递归实现八皇后问题

╰+攻爆jí腚メ 2021-11-09 08:34 440阅读 0赞

定义一个数组下标是列值是皇后放置位置

  1. package com.recursion;
  2. /**
  3. * @Auther: 大哥的叔
  4. * @Date: 2019/8/2 16:59
  5. * @Description:
  6. */
  7. public class Queue8 {
  8. //定义一个max表示共有多少个皇后
  9. int max=8;
  10. //定义一个数组,保存皇后位置的结果输出
  11. int array[] = new int[max];
  12. static int count = 0;
  13. static int judgeCount = 0;
  14. public static void main (String[] args) {
  15. Queue8 queue8 = new Queue8();
  16. queue8.check(0);
  17. System.out.printf("一共有%d解法", count);
  18. System.out.printf("一共判断冲突的次数%d次", judgeCount); // 1.5w
  19. }
  20. //编写一个方法,放置第n个皇后
  21. //特别注意: check 是 每一次递归时,进入到check中都有 for(int i = 0; i < max; i++),因此会有回溯
  22. private void check(int n){
  23. if (n==max){//n = 8 , 其实8个皇后就既然放好
  24. print();
  25. return;
  26. }
  27. //依次放入,并判断是否冲突
  28. for (int i = 0; i < max ; i++) {
  29. //
  30. array[n] = i;
  31. if (judge(n)){//不冲突
  32. check(n+1);
  33. }
  34. }
  35. //依次放入皇后,并判断是否冲突
  36. }
  37. //编写一个方法,放置第n个皇后
  38. //特别注意: check 是 每一次递归时,进入到check中都有 for(int i = 0; i < max; i++),因此会有回溯
  39. private boolean judge(int n){
  40. judgeCount++;
  41. for (int i = 0; i < n; i++) {
  42. // 说明
  43. //1. array[i] == array[n] 表示判断 第n个皇后是否和前面的n-1个皇后在同一列
  44. //2. Math.abs(n-i) == Math.abs(array[n] - array[i]) 表示判断第n个皇后是否和第i皇后是否在同一斜线
  45. // n = 1 放置第 2列 1 n = 1 array[1] = 1
  46. // Math.abs(1-0) == 1 Math.abs(array[n] - array[i]) = Math.abs(1-0) = 1
  47. //3. 判断是否在同一行, 没有必要,n 每次都在递增
  48. if (array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])){
  49. return false;
  50. }
  51. }
  52. return true;
  53. }
  54. private void print(){
  55. count++;
  56. for (int i = 0; i < array.length ; i++) {
  57. System.out.print(array[i]+" ");
  58. }
  59. System.out.println();
  60. }
  61. }

发表评论

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

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

相关阅读

    相关 --皇后

      八皇后这个典的问题,是每个真正程序员必须经历过的。这也是我第二次来解决这个问题了,第一次应该是学数据结构那时候吧。这次写起来顺利多了,基本没遇到什么卡壳的地方。递归+回溯。