【LeetCode-51】 N 皇后

问题

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

提示:

  • 1 <= n <= 9
  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

示例

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

解答

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        ans.assign(n, string(n, '.'));
        dfs(n, 0);
        return res;
    }
private:
    vector<string> ans;
    vector<vector<string>> res;
    bool col[9]{}, left[17]{}, right[17]{};
    void dfs(int n, int row) {
        if (row == n) {
            res.push_back(ans);
            return;
        }
        for (int i = 0; i < n; i++) {
            int lidx = n - 1 + row - i, ridx = row + i;
            if (col[i] || left[lidx] || right[ridx]) continue;
            col[i] = left[lidx] = right[ridx] = true;
            ans[row][i] = 'Q';
            dfs(n, row + 1);
            ans[row][i] = '.';
            col[i] = left[lidx] = right[ridx] = false;
        }
    }
};

重点思路

经典的回溯问题,注意如何使用\(O(1)\)的时间复杂度判断某点是否能放皇后。

posted @ 2021-08-09 17:45  tmpUser  阅读(27)  评论(0编辑  收藏  举报