public class Queen8Demo {
public static final int MAX = 8; // 8个皇后
public int[] array = new int[8]; // 使用一个一位数组保存皇后放置的位置,数组的索引代表皇后所在行,值代表所在列。
public int count = 0; // 统计解的个数
public static void main(String[] args) {
Queen8Demo queen = new Queen8Demo();
queen.checkQueen(0); // 从第0个皇后开始
System.out.println(queen.count); // 92种解法
}
/**
* 对每个皇后都遍历8次,每遍历一次,代表皇后向右走了一步,每次都调用noConflict判断当前位置是否可以放置皇后,
* 若可以则将它放置在该位置,再对下一个皇后进行遍历,每次遍历的目的都是为了找到一个不矛盾的位置并放置皇后,
* 一直重复上述过程。当出现其中一个皇后遍历8次都找不到合适位置的情况时,将回溯到上一个皇后的遍历过程,
* 继续使上一个皇后右移,寻找合适位置并放置,再对下一个皇后进行8次遍历,一直重复该过程,
* 直到最后一个皇后放置完毕(n == MAX)后return,返回到第0个皇后的遍历过程,继续向右走,然后重复上述过程。
* @param n 第n个皇后(0~7)
*/
public void checkQueen(int n) {
if (n == MAX) {
show();
count++;
return;
}
for (int i = 0; i < MAX; i++) {
array[n] = i;
if (noConflict(n)) {
checkQueen(n + 1);
}
}
}
/**
* 对第n个皇后以下的0 ~ n-1个皇后都进行检测,不能在同一列、同一斜线上
* 两皇后不可能在同一行,所以无需判断
* @param n 第n个皇后
* @return 冲突返回false,不冲突返回true
*/
public boolean noConflict(int n) {
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;
}
/**
* 显示列表array储存的结果
*/
public void show() {
for (int i = 0; i < MAX; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
递归回溯解决八皇后问题
最新推荐文章于 2022-03-21 16:03:44 发布