一、题目

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

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

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



示例 1:

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

示例 2:

输入:n = 1
输出:[["Q"]]



提示:

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

二、思路
  • 用cols来记录某列是否被选取过
  • 用d来记录某条对角线是否被选取, 由下标 i + j 可以得正对角线的坐标
  • ud来记录反对角线是否被选取过, 由下标n - i + j 可以得反对角线的下标
三、代码

class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<bool> cols(n), d(25), ud(25);
vector<vector<string>> ans;
vector<string> strs(n, string(n, '.'));
dfs(0, strs, cols, d, ud, ans, n);
return ans;
}
void dfs(int i, vector<string>& strs, vector<bool>& cols, vector<bool>& d, vector<bool>& ud, vector<vector<string>>& ans, int n) {
if (i == n) {
ans.push_back(strs);
return;
}
//选择一个位置进行放置
for (int j = 0; j < n; j++) {
if (!cols[j] && !d[i + j] && !ud[n - i + j]) {
cols[j] = d[i + j] = ud[n - i + j]= true;
strs[i][j] = 'Q';
dfs(i + 1, strs, cols, d, ud, ans, n);
strs[i][j] = '.';
cols[j] = d[i + j] = ud[n - i + j]= false;
}
}
}
};