#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<string>> recod;
vector<bool> col;//用以标记已找到元素的列`
vector<bool> del1;//用以标记已找到元素的左对角线,对角线上i+j的值相等且从0开始
vector<bool> del2;//用以标记已找到元素的左对角线,对角线上i-j+n-1的值相等且从0开始
//将列元素res转为string
vector<string> genera(int n,vector<int> res)
{
vector<string> tmp=vector<string>(n,string(n,'.'));
for(int i=0;i<n;i++){
tmp[i][res[i]]='Q';
}
return tmp;
}
void realQueue(int n, int index,vector<int>&res){
//当下标index==n时说明n行都已找到符合条件的坐标,将每列坐标点压入解中
if(index==n){
recod.push_back(genera(n,res));
return;
}
//保持行index不变的条件下,遍历本行的每一列
for(int i=0;i<n;i++){
//如果当前列元素不冲突则既不在已找到的元素一列也不再已找到元素的对角线上,递归寻找下一行
if(!col[i]&&!del1[index+i]&&!del2[index-i+n-1]){
//当前列元素不冲突时,将当前列元素计入res,并将此元素对应的列和对角线标注为已使用
col[i]=true;
del1[index+i] =true;
del2[index-i+n-1]=true;
res.push_back(i);
//递归寻找下一行元素的结果
realQueue(n,index+1,res);
//寻找完毕后需要将当前节点释放回去,用于后续的寻找
col[i]=false;
del1[index+i] =false;
del2[index-i+n-1]=false;
res.pop_back();
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
recod.clear();
//初始化列对角线n个元素
col=vector<bool>(n,false);
//初始化左右对角线共有2*n-1条对角线
del1=vector<bool>(2*n-1,false);
del2=vector<bool>(2*n-1,false);
vector<int> res;
realQueue(n,0,res);
return recod;
}
};
int main()
{
vector<vector<string>> tmp = Solution().solveNQueens(4);
for(int i=0;i<tmp.size();i++){
for(int j=0;j<tmp[0].size();j++)
{
cout<<tmp[i][j]<<endl;
}
}
getchar();
return 0;
}