请注意:我被要求以任何我喜欢的方式修改 NQueens 问题。我已经想到了这种方式,并想实现它。这不是一个直接的家庭作业问题,而是一个我如何实施自己的修改的问题。
我在下面编写了一个解决 4 个皇后的代码。所以根据这段代码,没有两个皇后可以在同一行、同一列、同一对角线上,从而不被攻击。我正在尝试修改它,如果我放置一个皇后,那么它可以放在同一列但跳过两行,它可以放在同一行跳过两列,同样它可以放在同一个对角线上跳过两个行和两列。
所以基本上,简单来说,女王可以放置在同一行,同一列和同一对角线上,跳过两个块。
对于 4 个皇后输出当前如下所示:
* Q * *
* * * Q
Q * * *
* * Q *
和
* * Q *
Q * * *
* * * Q
* Q * *
但是也应该给出以下输出:
Q * * Q
* * * *
* * * *
Q * * Q
所以在这里,女王每两个街区后被放置,水平,垂直和对角线。
代码:
import java.util.*;
public class Queens {
/***************************************…
* Return true if queen placement q[n] does not conflict with
* other queens q[0] through q[n-1]
****************************************/
public static boolean isConsistent(int[] q, int n) {
for (int i = 0; i < n; i++) {
if (q[i] == q[n]) return false; // same column
if ((q[i] - q[n]) == (n - i)) return false; // same major diagonal
if ((q[n] - q[i]) == (n - i)) return false; // same minor diagonal
}
return true;
}
/***************************************…
* Print out N-by-N placement of queens from permutation q in ASCII.
****************************************/
public static void printQueens(int[] q) {
int N = q.length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (q[i] == j) System.out.print("Q ");
else System.out.print("* ");
}
System.out.println();
}
System.out.println();
}
/***************************************…
* Try all permutations using backtracking
****************************************/
public static void enumerate(int N) {
int[] a = new int[N];
enumerate(a, 0);
}
public static void enumerate(int[] q, int n) {
int N = q.length;
if (n == N) printQueens(q);
else {
for (int i = 0; i < N; i++) {
q[n] = i;
if (isConsistent(q, n)) enumerate(q, n+1);
}
}
}
public static void main(String[] args) {
enumerate(4);
}
}
我究竟做错了什么?如何更改我的代码以使其适用于修改?