#include <vector>
#include <unordered_set>
#include <string>
#include <iostream>
using namespace std;
class Solution {
public:
Solution(){}
~Solution(){}
vector<vector<string>> solveNQueens(int n) {
//存储每一行Quenn的位置
auto queens=vector<int>(n,-1);
//返回结果
auto res=vector<vector<string>>();
//存储已经被占用的列
auto col=unordered_set<int>();
//存储已经被占用的正斜线
auto dia1=unordered_set<int>();
//存储已经被占用的反斜线
auto dia2=unordered_set<int>();
backtrack(res,queens,col,dia1,dia2,n,0);
return res;
}
void backtrack(vector<vector<string>>&res,vector<int> &queens,unordered_set<int> &col, unordered_set<int> &dia1,unordered_set<int> &dia2,int n ,int row){
if (row==n)
{
vector<string> v=getBoard(queens,n);
res.push_back(v);
}else{
for (int i = 0; i < n; i++)
{
//判断当前列是否被占用
if (col.find(i)!=col.end())
{
continue;
}
//判断当前正斜线是否被占用
int d1=row-i;//正斜线上的元素列与行的差相等
if (dia1.find(d1)!=dia1.end())
{
continue;
}
//判断当前反斜线是否被占用
int d2=row+i;//反斜线上的元素列与行的和相等
if (dia2.find(d2)!=dia2.end())
{
continue;
}
//存储当前Queen的位置
queens[row]=i;
col.insert(i);
dia1.insert(d1);
dia2.insert(d2);
backtrack(res,queens,col,dia1,dia2,n,row+1);
col.erase(i);
dia1.erase(d1);
dia2.erase(d2);
}
}
}
//获取每个结果集
vector<string> getBoard(vector<int> &queens,int n){
auto v=vector<string>();
for (int i = 0; i < n; i++)
{
string s=string(n,'.');
//将每一行的Queen放在对应的位置上
s[queens[i]]='Q';
v.push_back(s);
}
return v;
}
};
int main(){
Solution s;
auto res=vector<vector<string>>();
res=s.solveNQueens(4);
int len=res.size();
for (int i = 0; i < len; i++)
{
auto v=res[i];
for (int j = 0; j < 4; j++)
{
cout<<v[j]<<"\n";
}
cout<<"\n";
}
}