题目链接
分析
经典的回溯法问题
可以发现,对于左对角线,行列相减均相等;对于右对角线,行列相加均相等
所以我们使用 $col, d1,d2$ 分别记录列和两条对角线是否有皇后
回溯计算即可
代码实现
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ans;
vector<bool> col(n, false), d1(n * 2 - 1, false), d2(n * 2 - 1, false);
vector<int> queenidx(n);
auto dfs = [&](auto&& dfs, int r) {
if(r == n)
{
vector<string> board(n);
for(int i = 0; i < n; ++i) {
board[i] = string(n, '.');
board[i][queenidx[i]] = 'Q';
}
ans.push_back(board);
return ;
}
for(int c = 0; c < n; c++)
{
int t = r - c + n - 1;
if(!col[c] && !d1[r + c] && !d2[t])
{
queenidx[r] = c;
col[c] = d1[r + c] = d2[t] = true;
dfs(dfs, r + 1);
col[c] = d1[r + c] = d2[t] = false;
}
}
};
dfs(dfs, 0);
return ans;
}
};
复杂度分析
- 时间复杂度:$O(N!)$
- 空间复杂度:$O(n)$