n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
【分析】回溯法的经典应用,可以参考我写的这篇博客:回溯法与N皇后,有什么问题欢迎交流。
以下是这道题的代码实现;
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<int> queen(n,-1);
put_queen(res,queen,0);
return res;
}
bool isvalid(vector<int>& queen,int row){
for(int i = 0; i < row; ++i){
if( queen[i] == queen[row] || abs(i-row) == abs(queen[i]-queen[row]) )
return false;
}
return true;
}
void put_queen(vector<vector<string>> &res,vector<int>& queen,int row){
int n = queen.size();
for(int i = 0; i < n; ++i){
queen[row] = i;
if(isvalid(queen,row)){
if( row == n - 1 ){
Addsolution(res,queen);
}
else{
put_queen(res,queen,row+1);
}
}
}
}
void Addsolution(vector<vector<string>> &res,vector<int>& queen){
int n = queen.size();
vector<string> solution(n,string(n,'.'));
for(int i = 0; i < n; ++i){
solution[i][queen[i]] = 'Q';
}
res.push_back(solution);
}
};