1.51题
class Solution {
public:
int n;
vector<bool>col,dg,udg;//定义用没用过
vector<string>path;
vector<vector<string>> ans;//记录答案
vector<vector<string>> solveNQueens(int _n) {
n=_n;
col=vector<bool>(n);//定义大小
dg=udg=vector<bool>(n*2);
path=vector<string>(n,string(n,'.'));
dfs(0);
return ans;
}
void dfs(int u)
{
if(u==n)
{
ans.push_back(path);
return;
}
for(int i=0;i<n;i++)//i表示所有列数,u表示行
{
if(!col[i] && !dg[u+i] && !udg[u-i+n])
{
col[i]=dg[u+i]=udg[u-i+n]=true;
path[u][i]='Q';
dfs(u+1);
path[u][i]='.';//恢复现场
col[i]=dg[u+i]=udg[u-i+n]=false;
}
}
}
};
2.52题
class Solution {
public:
int n;
vector<bool>col,dg,udg;
int totalNQueens(int _n) {
n=_n;
col=vector<bool>(n);
dg=udg=vector<bool>(n*2);
return dfs(0);
}
int dfs(int u)
{
if(u==n) return 1;
int res=0;
for(int i=0;i<n;i++)
{
if(!col[i]&&!dg[u+i]&&!udg[u-i+n])
{
col[i]=dg[u+i]=udg[u-i+n]=true;
res+=dfs(u+1);
col[i]=dg[u+i]=udg[u-i+n]=false;
}
}
return res;
}
};