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
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
一次AC不调试是很爽的
常规思路 回溯就好了
class Solution {
public:
int index[10];
vector<vector<string>> out;
int pd(int hang,int lie){
for(int i = 1;i < hang;i++){
if(lie == index[i]) return 0;
if(index[i] + i == lie + hang) return 0;
if(i - index[i] == hang - lie) return 0;
}
return 1;
}
void Queue(int x,int n){
if(x == n + 1){
vector<string> temp;
for(int i = 1;i <= n;i++){
string fz = "";
for(int j = 1;j < index[i];j++) fz += '.';
fz += 'Q';
for(int j = index[i] + 1;j <= n;j++) fz += '.';
temp.push_back(fz);
}
out.push_back(temp);
return;
}
for(int i = 1;i <= n;i++){
if(pd(x,i)){
index[x] = i;
Queue(x+1,n);
index[x] = 0;
}
}
}
vector<vector<string>> solveNQueens(int n) {
Queue(1,n);
return out;
}
};