试探+回溯
递归(栈)
package Lesson1;
public class EightQueue {
// 对a中第row行皇后放在第col列进行冲突检查,若没有冲突,返回true
static boolean check(int[] a, int row, int col) {
for (int i = 0; i < row; i++) {// 检测该行以上的皇后
// 第k个皇后肯定放在第k行,不需进行行号冲突检测
// 检测列号是否冲突
if (col == a[i]) {
return false;
}
// 检测对角线是否冲突
if ((row - i) == Math.abs(col - a[i])) {// 行距等于列距,即在对角线上
return false;
}
}
return true;
}
static void show(int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
static void fun(int[] a, int k) {// 在a中放置第k个皇后
// 递归出口
if (k == 8) {// 放置完第8个皇后
show(a);// 显示解的结果
return;
}
for (int i = 0; i < 8; i++) {// 在一行中有8个位置可以放
a[k] = i;// 试探
// 冲突检测
if (check(a, k, i)) {// 若没有冲突,继续放下一个皇后
fun(a, k + 1);
}
}
}
public static void main(String[] args) {
int[] a = new int[8];// 记录每行中皇后的位置(列号)
fun(a, 0);// 从第0个皇后开始放置
}
}