首页 > 其他分享 >八皇后问题

八皇后问题

时间:2023-01-19 14:01:22浏览次数:35  
标签:同一 int 摆放 问题 answer 皇后 Math

问题:

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

 代码:

 1 import org.junit.Test;
 2 import java.util.Arrays;
 3 
 4 public class EightQueensTest {
 5     @Test
 6     public void test() {
 7         EightQueens eightQueens = new EightQueens();
 8         //从第0个皇后开始摆放
 9         eightQueens.putQueen(0);
10     }
11 }
12 
13 class EightQueens {
14 
15     /**
16      * 八皇后的一种解法
17      * 下标代表第几个皇后,在第几行
18      * 值代表在第几列
19      */
20     private int[] answer = new int[QUEEN_NUM];
21 
22     /**
23      * 第count种解法
24      */
25     private int count;
26 
27     /**
28      * 皇后的数量
29      */
30     public static final int QUEEN_NUM = 8;
31 
32     /**
33      * 是否不与其它皇后冲突
34      * @param n 摆第n个皇后
35      * @return
36      */
37     private boolean isPeace(int n) {
38         //皇后之间不冲突,则它们互相之间不在同一行、同一列、同一斜线
39         //第n个皇后摆在第n行,所以所有皇后不在同一行
40         for (int i = 0; i < n; i++) {
41             //answer[n] == answer[i]:第n个皇后与第i个皇后在同一列
42             //Math.abs(n - i) == Math.abs(answer[n] - answer[i]):第n个皇后与第i个皇后在同一斜线
43             //当第n个皇后与第i个皇后在同一斜线,那么它们的行数差==列数差
44             if (answer[n] == answer[i] || Math.abs(n - i) == Math.abs(answer[n] - answer[i])) {
45                 return false;
46             }
47         }
48         return true;
49     }
50 
51     /**
52      * 摆放第n个皇后
53      * @param n
54      */
55     public void putQueen(int n) {
56         if (n == QUEEN_NUM) {
57             //摆放第8个皇后,皇后从0开始算,也就说这是第九个皇后,则已经放好了八个皇后
58             count++;
59             printAnswer();
60             return;
61         }
62 
63         //第n个皇后有八种摆法
64         for (int i = 0; i < QUEEN_NUM; i++) {
65             //将第n个皇后摆在第i列
66             answer[n] = i;
67             if (isPeace(n)) {
68                 //第n个皇后摆放可行,则摆放第n + 1个皇后
69                 putQueen(n + 1);
70             }
71             //如果冲突,那继续循环将第n个皇后摆在后一列
72         }
73     }
74 
75     /**
76      * 打印解法
77      */
78     private void printAnswer() {
79         System.out.println("第" + count + "种解法:answer=" + Arrays.toString(answer));
80     }
81 }

 

标签:同一,int,摆放,问题,answer,皇后,Math
From: https://www.cnblogs.com/xueseng/p/17061387.html

相关文章