package com.cn;
import java.util.Arrays;
/**
* 回溯法解八皇后问题,我们用x[]来保存每一行我们放的皇后的位置,k表示的是哪一行。
* 然后开始寻找,最开始的时候k = 0,表示第一行, x[k] = x[k] + 1,把皇
* 后放在矩阵的第一个位置,k++,现在来寻找第二行的合适位置,place函数会判断所
* 放置的皇后的位置是否会与 前面的冲突,如果不冲突,并且x[k]的值<=n,说明还在范
* 围类,这是就可以继续向下寻找下一个点,直到k == n-1,即所以的皇后到找到了合适
* 的位置。如何刚才的x[k]>n了说明在k行没有找到一个可以放置的位置,所以这是后k--,
* 即是上一个位置不变的话是不能满足的,所以上一个位置向下移动一位。
* @author daijope
*
*/
public class BackTracking {
public static void main(String[] args) {
int[] x = new int[8];
x[0] = 0;
queen(x);
}
private static void queen(int[] x) {
int k = 0;
int n = x.length;
while(k >= 0) {
x[k] = x[k] + 1;
while(x[k] <= n && !place(x, k)) {
x[k] = x[k] + 1;
}
if (x[k] <= n) {
if (k == n - 1) {
System.out.println(Arrays.toString(x));
//return;//如果return了,那么就只寻找到一种方案,如果不return,那么会寻找到所有的方案。
} else {
k ++;
x[k] = 0;
}
} else {
k --;
}
}
}
private static boolean place(int[] x, int k) {
for (int i = 0; i < k; i++) {
if (x[i] == x[k]|| Math.abs(x[i] - x[k]) == k - i) {
return false;
}
}
return true;
}
}
回溯法解八皇后问题
最新推荐文章于 2022-07-13 15:21:31 发布