LeetCode52. N皇后 II

☆☆☆☆思路:如果在(i,j)处放置了一个皇后,那么

  1. 整个第 i 行的位置都不能放置;

  2. 整个第 j 列的位置都不能放置。

  3. 如果位置(a,b)满足|a-i|==|b-j|,说明(a,b)和(i,j)处在同一条斜线上,也不能放置。

 

代码1(参考左神书,耗时2ms):

class Solution {
    int res = 0;
    public int totalNQueens(int n) {
        if (n < 1) return res;
        int[] record = new int[n]; // record[i]记录第i行皇后所在的列
        dfs(0, n, record);
        return res;
    }
    private void dfs(int row, int n, int[] record) {
        if (row == n) {
            res ++;
            return;
        }
        for (int j = 0; j < n; j++) { //遍历列
            if (isValid(record, row, j)) {
                record[row] = j;
                dfs(row + 1, n, record);
            }
        }
    }
    private boolean isValid(int[] record, int row, int j) {
        for (int k = 0; k < row; k++) {
            if (record[k] == j || Math.abs(row - k) == Math.abs(j - record[k])) {
                return false;
            }
        }
        return true;
    }
}

 

代码2(最优解  ->  位运算加速):

M

 

posted @ 2020-12-30 15:56  不学无墅_NKer  阅读(73)  评论(0编辑  收藏  举报