题目如下:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
这题主要就是要输出恶心了一点,我们可以到最后才处理输出,也就是说,我们可以先记录位置信息,最后再把位置信息转化成字符串表示出来就好。
具体做法就是:在遍历过程中记录用一个vector记录每一次状态的列的状态,就是说这一次符合要求的状态第一行放在第几列,第二行放在第几列。。。第n行放在第几列。所以这一个vector只需要记载n个数。然后如果有m种符合要求的状态,那么就在外面在套一层vector,记录这M个可能的状态。
这样所有状态都被记录在内,并且要变成字符串就在最后处理一下即可。详见代码:
class Solution {
public:
vector< vector<int> >v;
void dfs(vector<int> ve,int n){ #遍历,找所有的状态,记录每一种状态的位置信息
int sz = ve.size();
if(sz==n){
v.push_back(ve);
return;
}
if(sz==0){
for(int i=0;i<n;i++){
ve.push_back(i);
dfs(ve,n);
ve.pop_back();
}
return ;
}
for(int i=0;i<n;i++){
bool flag = 0;
for(int j=0;j<sz;j++){
int tmp = ve[j];
if(tmp==i||abs(sz-j)==abs(i-tmp)){
flag = 1;
}
}
if(!flag){
ve.push_back(i);
int ssz = ve.size();
if(ssz==n){
v.push_back(ve);
return ;
}
dfs(ve,n);
ve.pop_back();
}
}
}
vector<vector<string> > solveNQueens(int n) {
vector<int>ii;
dfs(ii,n);
int ssz = v.size();#把位置变成字符串
vector<vector<string> >vv;
vector<string>vs;
string s="";
for(int i=0;i<n;i++)s+="."; #最后第几个是Q就把那个字符替换成Q即可
for(int i=0;i<ssz;i++){
for(int j=0;j<n;j++){
int tmp = v[i][j];
s[tmp] = 'Q';
vs.push_back(s);
s[tmp] = '.';
}
vv.push_back(vs);
vs.clear();
}
return vv;
}
};
以上