Leetcode 52. N 皇后 II

Leetcode 52. N 皇后 II

原题链接

class Solution {
    int result = 0;
    // 将 n 皇后的 N 定义为全局变量,减少传参
    int nQueue;
    // columns[i] 表示在第 i 列上是否存在皇后,如果存在,columns[i]为true;否则为false
    boolean[] columns;
    // diagonals[i] 表示在第 i 条斜线(左上-->右下)上是否存在皇后,如果存在,diagonals[i]为true,否则为false
    // i = row+col
    boolean[] diagonals;
    // unDiagonals[i] 表示在第 i 条斜线(右上-->左下)上是否存在皇后,如果存在,unDiagonals[i]为true,否则为false
    // i = row-col+nQueue
    boolean[] unDiagonals;

    public int totalNQueens(int n) {
        nQueue = n;
        columns = new boolean[n];
        diagonals = new boolean[n * 2];
        unDiagonals = new boolean[n * 2];
        backTrack(0);
        return result;
    }

    private void backTrack(int row) {
        if (row == nQueue) {
            result++;
            return;
        }
        for (int col = 0; col < nQueue; col++) {
            //如果在第col列,点(row,col)所在的两条对角线上都没有皇后,则可以放置皇后
            if (!columns[col] && !diagonals[row + col] && !unDiagonals[row - col + nQueue]) {
                // 破坏现场
                columns[col] = true;
                diagonals[row + col] = true;
                unDiagonals[row - col + nQueue] = true;

                backTrack(row + 1);

                // 恢复现场
                columns[col] = false;
                diagonals[row + col] = false;
                unDiagonals[row - col + nQueue] = false;
            }
        }
    }
}

你可能感兴趣的:(LeetCode)