NQueens拼图,女王不放?

时间:2017-01-17 21:44:05

标签: java recursion

我正在为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");
    }
}

1 个答案:

答案 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;
    }
}

同样用于对角线。