【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)\)的时间复杂度判断某点是否能放皇后。