题目链接:https://leetcode-cn.com/problems/n-queens/
题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
思路
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<string> v(n, string(n,'.'));
vector<vector<string>> ret;
dfs(v, 0, ret);
return ret;
}
private:
bool isValid(vector<string> &v, int row, int col){
bool valid = true;
for(int i = 0; valid && i < row; i++) // 检查该列
valid = v[i][col]!= 'Q';
// for(int i = 0; valid && i < col; i++) // 检查该行 按行递归不需要检查行
// valid = v[row][i]!= 'Q';
for(int i = row - 1 ,j = col-1; valid && i>=0 && j>=0;)
valid = v[i--][j--]!= 'Q'; // 检查反对角线
for(int i = row+-1, j = col+1; valid && i>=0 && j <v.size();)
valid = v[i--][j++]!= 'Q'; // 检查对角线
return valid;
}
// 按行递归
void dfs(vector<string> &v, int row, vector<vector<string> > &ret){
if(row == v.size()){
ret.push_back(v);
return;
}
for(int col = 0; col < v.size(); ++col){
v[row][col] = 'Q';
if(isValid(v, row, col))
dfs(v, row + 1, ret);
v[row][col] = '.'; // 回溯
}
}
};