问题描述
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
代码
public class Main {
static int maxSize = 8;
static int[] array = new int[maxSize];
static int count = 0;
public static void main(String[] args) {
check(0);
}
//开始探索方案了
public static void check(int n){
if (n == 8){
//说明已经放完了 退出
print();
return;
}
for (int i = 0;i < maxSize;i++){
array[n] = i;
if (judge(n)){
//如果不冲突,则放下一个皇后
check(n + 1);
}
}
}
//判断第n+1个皇后与前面所有的皇后是否冲突 因为n是从0开始的,第八个皇后,n是7
public static boolean judge(int n){
for (int i = 0;i < n;i++){
//array[i] == array[n] 是判断是否在同一列
//Math.abs(n - i) == Math.abs(array[n] - array[i]) 是判断是否在统一斜线 也就是横坐标减横坐标是否等于纵坐标减纵坐标
if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
return false;//说明有冲突 返回false
}
}
return true;//没有冲突 返回true
}
//打印
public static void print(){
count++;
for (int i = 0;i < maxSize;i++){
System.out.print(array[i] + " ");
}
System.out.print("这是第"+ count +"个方案");
System.out.println();
}
}
结果
0 4 7 5 2 6 1 3 这是第1个方案
0 5 7 2 6 3 1 4 这是第2个方案
0 6 3 5 7 1 4 2 这是第3个方案
0 6 4 7 1 3 5 2 这是第4个方案
1 3 5 7 2 0 6 4 这是第5个方案
1 4 6 0 2 7 5 3 这是第6个方案
1 4 6 3 0 7 5 2 这是第7个方案
1 5 0 6 3 7 2 4 这是第8个方案
1 5 7 2 0 3 6 4 这是第9个方案
1 6 2 5 7 4 0 3 这是第10个方案
1 6 4 7 0 3 5 2 这是第11个方案
1 7 5 0 2 4 6 3 这是第12个方案
2 0 6 4 7 1 3 5 这是第13个方案
2 4 1 7 0 6 3 5 这是第14个方案
2 4 1 7 5 3 6 0 这是第15个方案
2 4 6 0 3 1 7 5 这是第16个方案
2 4 7 3 0 6 1 5 这是第17个方案
2 5 1 4 7 0 6 3 这是第18个方案
2 5 1 6 0 3 7 4 这是第19个方案
2 5 1 6 4 0 7 3 这是第20个方案
2 5 3 0 7 4 6 1 这是第21个方案
2 5 3 1 7 4 6 0 这是第22个方案
2 5 7 0 3 6 4 1 这是第23个方案
2 5 7 0 4 6 1 3 这是第24个方案
2 5 7 1 3 0 6 4 这是第25个方案
2 6 1 7 4 0 3 5 这是第26个方案
2 6 1 7 5 3 0 4 这是第27个方案
2 7 3 6 0 5 1 4 这是第28个方案
3 0 4 7 1 6 2 5 这是第29个方案
3 0 4 7 5 2 6 1 这是第30个方案
3 1 4 7 5 0 2 6 这是第31个方案
3 1 6 2 5 7 0 4 这是第32个方案
3 1 6 2 5 7 4 0 这是第33个方案
3 1 6 4 0 7 5 2 这是第34个方案
3 1 7 4 6 0 2 5 这是第35个方案
3 1 7 5 0 2 4 6 这是第36个方案
3 5 0 4 1 7 2 6 这是第37个方案
3 5 7 1 6 0 2 4 这是第38个方案
3 5 7 2 0 6 4 1 这是第39个方案
3 6 0 7 4 1 5 2 这是第40个方案
3 6 2 7 1 4 0 5 这是第41个方案
3 6 4 1 5 0 2 7 这是第42个方案
3 6 4 2 0 5 7 1 这是第43个方案
3 7 0 2 5 1 6 4 这是第44个方案
3 7 0 4 6 1 5 2 这是第45个方案
3 7 4 2 0 6 1 5 这是第46个方案
4 0 3 5 7 1 6 2 这是第47个方案
4 0 7 3 1 6 2 5 这是第48个方案
4 0 7 5 2 6 1 3 这是第49个方案
4 1 3 5 7 2 0 6 这是第50个方案
4 1 3 6 2 7 5 0 这是第51个方案
4 1 5 0 6 3 7 2 这是第52个方案
4 1 7 0 3 6 2 5 这是第53个方案
4 2 0 5 7 1 3 6 这是第54个方案
4 2 0 6 1 7 5 3 这是第55个方案
4 2 7 3 6 0 5 1 这是第56个方案
4 6 0 2 7 5 3 1 这是第57个方案
4 6 0 3 1 7 5 2 这是第58个方案
4 6 1 3 7 0 2 5 这是第59个方案
4 6 1 5 2 0 3 7 这是第60个方案
4 6 1 5 2 0 7 3 这是第61个方案
4 6 3 0 2 7 5 1 这是第62个方案
4 7 3 0 2 5 1 6 这是第63个方案
4 7 3 0 6 1 5 2 这是第64个方案
5 0 4 1 7 2 6 3 这是第65个方案
5 1 6 0 2 4 7 3 这是第66个方案
5 1 6 0 3 7 4 2 这是第67个方案
5 2 0 6 4 7 1 3 这是第68个方案
5 2 0 7 3 1 6 4 这是第69个方案
5 2 0 7 4 1 3 6 这是第70个方案
5 2 4 6 0 3 1 7 这是第71个方案
5 2 4 7 0 3 1 6 这是第72个方案
5 2 6 1 3 7 0 4 这是第73个方案
5 2 6 1 7 4 0 3 这是第74个方案
5 2 6 3 0 7 1 4 这是第75个方案
5 3 0 4 7 1 6 2 这是第76个方案
5 3 1 7 4 6 0 2 这是第77个方案
5 3 6 0 2 4 1 7 这是第78个方案
5 3 6 0 7 1 4 2 这是第79个方案
5 7 1 3 0 6 4 2 这是第80个方案
6 0 2 7 5 3 1 4 这是第81个方案
6 1 3 0 7 4 2 5 这是第82个方案
6 1 5 2 0 3 7 4 这是第83个方案
6 2 0 5 7 4 1 3 这是第84个方案
6 2 7 1 4 0 5 3 这是第85个方案
6 3 1 4 7 0 2 5 这是第86个方案
6 3 1 7 5 0 2 4 这是第87个方案
6 4 2 0 5 7 1 3 这是第88个方案
7 1 3 0 6 4 2 5 这是第89个方案
7 1 4 2 0 6 3 5 这是第90个方案
7 2 0 5 1 4 6 3 这是第91个方案
7 3 0 2 5 1 6 4 这是第92个方案
Process finished with exit code 0