public class NQueen1 {
static int n; // 皇后个数
static int[] x; // 当前解
static long sum; // 当前已找到的可行方案数
public static long nQueen(int nn) {
n = nn;
sum = 0;
x = new int[n + 1];
for (int i = 0; i < n; i++) x[i] = 0;
backtrack(1);
return sum;
}
// 下标是行
private static boolean place(int k) { // x[k] == y2
for (int j = 1; j < k; j++) // j是已经安放的皇后的行
if ((Math.abs(k - j) == Math.abs(x[j] - x[k])) || (x[j] == x[k])){
return false;
}
return true;
}
private static void backtrack(int t) {
if (t > n) {
sum ++;
System.out.println(Arrays.toString(x));
} else {
for (int i = 1; i <= n; i++) {
x[t] = i;
if (place(t)){ // 这一行可以放了,及到下一行去
backtrack(t + 1);
}
}
}
}
public static void main(String[] args) {
long l = NQueen1.nQueen(4);
System.out.println(l);
System.out.println(Arrays.toString(NQueen1.x));
}
}
(回溯法)递归解决n皇后问题
最新推荐文章于 2023-06-13 21:58:26 发布