我正在为NQueens问题编写一个递归程序,具有指定的板大小。我的问题是,皇后没有被放在板上,我不知道为什么。我已经尝试过追踪该计划,但我仍然没有看到我的问题。有什么建议?
public class Main {
public static boolean[][] board;
public static void main(String[] args) throws FileNotFoundException {
Scanner scan = new Scanner(System.in);
System.out.println("Enter size of board");
int n = scan.nextInt();
board = new boolean[n][n];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
board[i][j] = false;
}
}
NQueens(0);
printBoard();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] == true) {
System.out.println((i + 1) + " " + (j + 1));
}
}
}
}
static boolean NQueens(int col) {
if (col >= board.length)
return true;
for (int i = 0; i < board.length; i++) {
if (checkNotBlocked(col, i)) {
board[col][i] = true;
if (NQueens(col + 1))
return true;
board[col][i] = false;
}
}
return false;
}
static boolean checkNotBlocked(int col, int row) {
for (int i = 0; i < col; i++) {
if (board[i][row] == true)
return false;
}
for (int i = col; i >= 0; i--) {
for (int j = row; j >= 0; j--) {
if (board[i][j] == true)
return false;
}
}
for (int i = col; i >= 0; i--) {
for (int j = row; j < board.length; j++) {
if (board[i][j] == true)
return false;
}
}
return true;
}
static void printBoard() {
int i;
for (i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] == true) {
System.out.print("Q\t");
} else {
System.out.print("_\t");
}
}
System.out.println("\n");
}
}
答案 0 :(得分:0)
您对对角线的检查不正确。您使用了嵌套循环,这意味着您要检查整个矩形,而不仅仅是包含方形的对角线。如果在边界框内的任何其他行上有一个女王,您将拒绝放置下一个女王。因为这将在第一个女王被放置之后发生,所以你永远不会让第二个女王登上董事会。
请注意逻辑与您所拥有的不同之处:
for (int i = col; i >= 0; i--) {
for (int j = row; j >= 0; j--) {
if (board[i][j] == true)
return false;
}
}
...迭代从[col] [row]到[0] [0]的所有有序对...而不是仅检查对角线:
for (int i = col, j = row; // My apologies if this isn't legal Java;
i >= 0 & j >= 0; // I'm out of practice.
i--, j--) { // i and j must decrement *together*.
if (board[i][j])
return false;
}
}
同样用于对角线。