八皇后问题算法思路分析:
(1)第一个皇后先放第一行第一列
(2)第二个皇后放在第二行第一列,然后判断是否OK,如果不 OK,继续放在第二列、第三列,依次把所有列都放完,找到一个合适的位置
(3)继续第三个皇后,还是第一列、第二列......直到第八个皇后也能放在一个不冲突的位置,算是找到了一个正确解
(4)当得到一个正确解,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到
(5)然后回头继续第一个皇后放到第二列,后面继续循环执行1,2,3,4的步骤
说明:理论上应该创建一个二维数组来表示棋盘,但实际上可以通过算法,用一个一维数组即可解决问题。arr[8] = {0,4,7,5,2,6,1,3}。对应的arr下标表示第几行。arr[3] = 4 表示第4个皇后放在第5列的位置
整体代码:
/*
* 项目名称:ANA
* 文件名称:Queue8.java
* Date:2023/10/7 上午10:31
* Author:yan_Bingo
*/
package Learning;
/**
* @author Yan_Bingo
* @version 1.0
* Create by 2023/10/7 10:31
*/
public class Queue8 {
// 设置皇后的数量
int max = 8;
// 统计8皇后解法的个数
static int count = 0;
// 统计8皇后判断冲突的次数
static int judgeCount = 0;
// 用 array 数组表示 array[3] = 5 表示 第四个皇后放在第六列
int [] array = new int[max];
public static void main(String[] args) {
Queue8 queue8 = new Queue8();
queue8.check(0);
System.out.printf("共有%d种解法\n", count);
System.out.printf("一共判断了冲突%d次", judgeCount);
}
// 开始摆放从 n 到 max 个皇后
private void check(int n){
if(n == max){ // 此时说明已经摆放到第九个皇后了
print();
return;
}
for (int i = 0; i < max; i++) {
array[n] = i;
if(judge(n)){ // 说明摆放的位置不冲突
check(n + 1); // 继续摆放下一个皇后,直到第8个为止
}
// 如果摆放的位置冲突,将继续回溯,因为我们第一列开始摆放的,不断地往下一列继续回溯
}
}
/**
* 判断 表示第 n+1 个皇后是否与前面皇后摆放的位置冲突
* array[i] == array[n] 表示是否在同一列
* Math.abs(n - i) == Math.abs(array[n] - array[i]) 表示是否在同一斜线
* @param n 表示第 n+1 个皇后
* @return
*/
private boolean judge(int n){
judgeCount++;
for (int i = 0; i < n; i++) {
if(array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
}
// 输出8个皇后摆放的位置
private void print(){
count++;
for (int i = 0; i < max; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}