问题简述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当n2=1或n1≥4时问题有解。

解决方案一:递归
思路分析:
定义num来控制皇后的个数,初始设置为8
定义count来计数,计算问题的解决方案总数
定义数组array[num]来存储每一组方案的结果
定义查找方法find(int n),参数n代表当前放的是第几个皇后,n从0开始
在find中调用输出方法print(),每查找到一组结果就打印输出
在find中调用判断方法judge(int n),判断第n个皇后的当前列和对角线上是否有其它皇后
如果没有,在find中递归查找下一个皇后的位置,查找结束就开始循环查找下一组
最后在main方法中调用find方法即可

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
* 八皇后——>n皇后
* 描述:在8X8棋盘放8个皇后,任何一个皇后都无法直接吃掉其他的皇后,问一共有多少种方法
* 时间:2018-7-21 16:47:11
* @author LousenJay
*
*/
public class Queen {
private int num = 8; //设置皇后的个数
public static int count = 0; //计数
private int[] array = new int[num]; //保存结果,第一个皇后在array[0],第二个在array[1]
/**
* 打印结果
*/
private void print(int n){
//打印一组结果
System.out.println("第"+n+"组:");
for (int i = 0; i < num; i++) {
System.out.print(array[i]+1+" ");
}
System.out.println();//换行
System.out.println("棋盘展示:");
for (int i = 0; i < num; i++) { //打印行
for (int j = 0; j < num; j++) { //打印列
if(j == array[i]){
System.out.print("♛");
}else{
System.out.print("☒");
}
}
System.out.println();
}
System.out.println();
}
/**
* 判断第n行的皇后在当前列和对角线上是否有皇后
* 如果有则返回false,循环下一个列继续匹配
* 如果该列符合则返回true,开始下一行查找
* @param n
* @return
*/
private boolean judge(int n){
for (int i = 0; i < n; i++) {
//判断第n行的皇后在当前列和对角线上是否有皇后
if(array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
}
/**
* n代表当前放的是第几个皇后
* array[n]代表第n个皇后的列的位置
* @param n
*/
private void find(int n){
/*如果皇后全部放完了,则计数并打印该种方法*/
if(n == num){
count++;//计数
print(count);//输出
return;
}
/*开始第一组查找,先从第一行的8个列开始查找,符合条件开始依次查找第二行,
* 八行全部符合条件,查找结束,计数+1并打印结果
* 不符合就开始查找第二组
* 最后所有结果全部查找完毕,跳出递归循环*/
for (int i = 0; i < num; i++) {
array[n] = i; //遍历每一列放置的八种可能,列
if(judge(n)){ //行
find(n+1); //递归查找第二列
}
}
}
public static void main(String[] args) {
Queen q = new Queen();
q.find(0); //从第一行开始查找
System.out.println("总计:"+q.count+"种方法");
}
}

最后更新: 2020年07月27日 03:54

原始链接: https://www.lousenjay.top/2018/07/22/算法-八皇后问题/