运行结果
说明
在本题中,棋盘是由8行8列,共64个格子构成
运行结果中的 [7, 3, 0, 2, 5, 1, 6, 4] 的意思是:
- 第1行第8(7+1)列放第1个皇后
- 第2行第4(3+1)列放第2个皇后
- 第3行第1(0+1)列放第3个皇后
- 其它依此类推…
示意图如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
* | |||||||
* | |||||||
* | |||||||
* | |||||||
* | |||||||
* | |||||||
* | |||||||
* |
源代码
import java.util.Arrays;
// 八皇后问题求解
public class Queue8 {
// 皇后的个数
int max = 8;
// 摆放方案的个数
static int count = 0;
// 保存每个皇后的位置,因为每行只放一个皇后,所以只用了一个一维数组保存列号即可
int[] arr = new int[max];
public static void main(String[] args) {
Queue8 queue8 = new Queue8();
queue8.layout(0);
System.out.println("八皇后问题共有"+count+"个解法");
}
// 放置皇后
private void layout(int n) {
if(n == max) {
// 这时说明已经摆放完了
System.out.println(Arrays.toString(arr));
count++;
return;
}
// 对每个皇后,都依次去尝试摆放在每一列
for(int i = 0; i < max; i++) {
arr[n] = i;
// 判断这个皇后摆放位置是否冲突
if(judge(n)) {
// 如果当前位置不冲突,继续递归,摆放下一个皇后
layout(n+1);
}
// 如果发生冲突,进入下一轮循环,尝试摆放在下一列
}
}
// 判断第n个皇后是否和前面的冲突
private boolean judge(int n) {
for(int i = 0; i < n; i++) {
// 判断是否在同一列,或一条对角线上
if(arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[i] - arr[n])) {
return false;
}
}
return true;
}
}
版权声明:本文为qq_38902844原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。