52. N皇后 II

177 阅读1分钟

class Solution {
   int ans = 0;
    //是否是同一列
    boolean[] col;
    //是否是同一主对角线
    boolean[] diag1;
    //是否是同一副对角线
    boolean[] diag2;
    
    public int totalNQueens(int n) {
        col = new boolean[n];
        diag1 = new boolean[2 * n - 1];
        diag2 = new boolean[2 * n - 1];
        dfs(n, 0);
        return ans;
    }

    private void dfs(int n, int start) {
        if (start == n) {
            ans++;
            return;
        }
        for (int i = 0; i < n; i++) {
            if (col[i] || diag1[start + i] || diag2[start - i + n - 1]) {
                continue;
            }
            col[i] = diag1[start + i] = diag2[start - i + n - 1] = true;
            dfs(n, start + 1);
            col[i] = diag1[start + i] = diag2[start - i + n - 1] = false;
        }
    }
}