话不多说,直接上代码
class Solution {
private:
vector<vector<string>> result;
public:
vector<vector<string>> solveNQueens(int n) {
//深搜问题
vector<string> cur1(n,string(n,'.'));//先开始直接初始化
vector<string> &cur=cur1;
helper(cur,0);
return result;
}
void helper(vector<string> &cur,int num)//对第m行操作
{
int curNum=cur.size();
if(curNum==num)//必须走到底部才算合法
{
result.push_back(cur);
return;
}
for(int i=0;i<curNum;i++)//放在第m行的哪一列
{
if(isValid(cur,num,i))//判断放在该列会不会引起 冲突 即进行剪枝
{
cur[num][i]='Q';
helper(cur,num+1);//同样递归到下一行操作
cur[num][i]='.';//回滚一次
}
}
}
bool isValid(vector<string> &cur,int num,int col)
{
//判断列
int i,j;
int curNum=cur.size();
for(j=0;j<num;j++)
{
if(cur[j][col]=='Q')
return false;
}
//左上方斜对角线
for(i=num-1,j=col-1;i>=0&&j>=0;i--,j--)
{
if(cur[i][j]=='Q')
return false;
}
//右上方斜对角线
for(i=num-1,j=col+1;i>=0&&j<=curNum;i--,j++)
{
if(cur[i][j]=='Q')
return false;
}
return true;
}
};