思路:在全排列的基础上多了一些判断,但不要在生产全排列后进行判断,应该边生成边判断节约时间
void P(vector<vector<string>> &result,vector<int> &now,vector<bool> &flag,int n,int index)
{
if(index==n)
{
vector<string> s;
for(int i=0;i<n;i++)
{
string str(n,'.');
str[now[i]]='Q';
s.push_back(str);
}
result.push_back(s);
}
else
{
for(int i=0;i<n;i++)
{
if(flag[i]==false)
{
bool f=false;
for(int j=0;j<index;j++)//此处用了循环搜索来排除,其实可再用两个数组直接判断,更有甚者简化为一个数组
{
if(j-now[j]==index-i) {f=true;break;}
if(now[j]+j==index+i) {f=true;break;}
}
if(f==false)
{
now.push_back(i);
flag[i]=true;
P(result,now,flag,n,index+1);
now.pop_back();
flag[i]=false;
}
}
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<bool> flag(n,false);//vector初始化
vector<int> now;
P(result,now,flag,n,0);
return result;
}