13--递归【8皇后问题】

 

 

 

 说明:理论上应该使用一个二维数组表示棋盘,但是其实可以用一个一维数组表示各个皇后放置的位置 -->

如:arr[8] = {0,4,7,5,2,6,1,3},取出任一元素表示arr[i] = val,表示的就是将第i+1个皇后【i从0开始】放置在i+1行的arr[i+1]列

 1 public class Queen8Question {
 2     //定义一个max表示共有多少个皇后 
 3     int max = 8;
 4     int[] chess = new int[max];
 5     static int count;
 6     static int way;
 7     public static void main(String[] args) {
 8         Queen8Question q8 = new Queen8Question();
 9         q8.setQueen(0);
10         System.out.println("判断了:" + count);
11         System.out.println("放置方式种类:" + way);
12     }
13 
14     //打印棋盘
15     public void print() {
16         way++;
17         for(int i = 0; i < chess.length; i++) {
18             System.out.printf("%d ",chess[i]);
19         }
20         System.out.println();
21     }
22     
23     //判断:当放置第n+1个皇后时【n从0开始】,与前边行数放置的皇后是否冲突【同一行、同一列、同一斜线】
24     public boolean judge(int n) {
25         count++;
26         for (int i = 0; i < n; i++) {
27             //chess[i] & chess[n]判断是否在同一列
28             //Math.abs(n-i) & Math.abs(chess[n] - chess[i])【可以理解为斜率的绝对值是否相等】【或者行差是否等于列差】
29             if (chess[i] == chess[n] || Math.abs(n - i) == Math.abs(chess[n] - chess[i])) {
30                 return false;
31             }
32         }
33         return true;
34     }
35     
36     //放置皇后,从0开始
37     public void setQueen(int n) {
38         if (n == max) {
39             print();
40             return;
41         }else {
42             for(int i = 0; i < max; i++) {
43                 chess[n] = i;
44                 if (judge(n)) {    //不冲突
45                     setQueen(n+1); //放置下个皇后
46                 }
47                 //如果冲突则放置当前行的下一列
48             }
49         }
50     }
51     
52 }

 

 种类较多,未全部展示~

posted @ 2022-09-23 21:20  羽梦齐飞  阅读(15)  评论(0编辑  收藏  举报