题目链接
solution1:
class Solution {
private:
vector<bool> col;
vector<bool> pail1;
vector<bool> pail2;
void putQueen(int n,int index,vector<int> row)
{
if(index == n) res.push_back(generateBoard(n,row));//当遍历到最后一行时,得到一个结果
for(int i = 0;i<n;i++)
{
if(!col[i] && !pail1[index+i] && !pail2[index-i+n-1])//不在同一列,统一斜对角线
{
row.push_back(i);
col[i] = 1;
pail1[i+index] = 1;
pail2[index - i + n -1] = 1;
putQueen(n,index+1,row);
row.pop_back();
col[i] = 0;
pail1[i+index] = 0;
pail2[index - i + n -1] = 0;
}
}
}
vector<string> generateBoard(int n,vector<int> row)
{
vector<string> board(n,string(n,'.'));
for(int i=0;i<n;i++)
{
board[i][row[i]] = 'Q';
}
return board;
}
public:
vector<vector<string>> res;
vector<vector<string>> solveNQueens(int n) {
col = vector<bool>(n,false);
pail1 = vector<bool>(2*n-1,false);
pail2 = vector<bool>(2*n-1,false);
res.clear();
vector<int> row;//存放每一行皇后的列
putQueen(n,0,row);
return res;
}
};
solution2:
class Solution {
private:
vector<bool> col;
vector<string> queen;
bool isvalid(int n,int x,int y)
{
for(int i=0;i<n;i++)
{
if(queen[i][y] == 'Q') return false;
}
for(int i=x-1,j=y-1;i>=0&&j>=0;--i,--j)
{
if(queen[i][j] == 'Q') return false;
}
for(int i=x-1,j=y+1;i>=0&&j<n;--i,++j)
{
if(queen[i][j] == 'Q') return false;
}
return true;
}
void putQueen(int n,int index)
{
if(index == n) res.push_back(queen);//当遍历到最后一行时,得到一个结果
for(int i = 0;i<n;i++)
{
if(isvalid(n,index,i))//不在同一列,统一斜对角线
{
queen[index][i] = 'Q';
putQueen(n,index+1);
queen[index][i] = '.';
}
}
}
public:
vector<vector<string>> res;
vector<vector<string>> solveNQueens(int n) {
col = vector<bool>(n,false);
queen = vector<string>(n,string(n,'.'));
res.clear();
putQueen(n,0);
return res;
}
};