n皇后问题

如果按列从左向右放置皇后,需要用三个数组记录之前已经用过的行,主对角线,次对角线。

可以用状态压缩的方法简化问题。用三个数的二进制表示已经用过的行和两条对角线,

LC52. N-Queens II 输出n皇后解的个数

class Solution {
public:
    int cnt = 0;
    int n;
    void dfs(int dep, int r, int s1, int s2) {
        if (dep == n) {
            cnt++;
            return;
        }
        for (int i = 0; i < n; ++i) {
            int j = 1 << i;
            if ((j & r) || (j & s1) || (j & s2)) continue;
            dfs(dep + 1, j | r, (j | s1) << 1, (j | s2) >> 1);
        }
    }
    int totalNQueens(int n) {
        cnt = 0;
        this -> n = n;
        dfs(0, 0, 0, 0);
        return cnt;
    }
};

LC51. N-QueensLC 输出n皇后所有的解

class Solution {
public:
    int n;
    vector<string> g;
    vector<vector<string>> res;
    void dfs(int dep, int r, int s1, int s2) {
        if (dep == n) {
            res.push_back(g);
            return;
        }
        for (int i = 0; i < n; ++i) {
            int j = 1 << i;
            if ((r & j) || (s1 & j) || (s2 & j)) continue;
            g[i][dep] = 'Q';
            dfs(dep + 1, r | j, (s1 | j) << 1, (s2 | j) >> 1);
            g[i][dep] = '.';
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        this -> n = n;
        g.assign(n, string(n, '.'));
        dfs(0, 0, 0, 0);
        return res;
    }
};
原文地址:https://www.cnblogs.com/betaa/p/12448229.html