【second】N-Queens
回溯法
vector<vector<string> > solveNQueens(int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<string>> res;
vector<int> queens;
vector<bool> cols(n,false);
vector<bool> diag(2*n,false);
vector<bool> ardiag(2*n,false);
dfs(0,n,queens,cols,diag,ardiag,res);
return res;
}
void dfs(int row,int n,vector<int>& queens,vector<bool>& cols,vector<bool>& diag,vector<bool>& ardiag,vector<vector<string>>& res)
{
if(row==n)
{
generate(queens,res);
return;
}
for(int i=0;i<n;i++)
{
if(!cols[i]&&!diag[i-row+n]&&!ardiag[i+row])
{
cols[i] = diag[i-row+n] = ardiag[i+row] = true;
queens.push_back(i);
dfs(row+1,n,queens,cols,diag,ardiag,res);
cols[i] = diag[i-row+n] = ardiag[i+row] = false;
queens.pop_back();
}
}
}
void generate(vector<int>& queens,vector<vector<string>>& res)
{
int n = queens.size();
vector<string> tmp(n,string(n,'.'));
for(int i=0;i<n;i++)
tmp[i][queens[i]] = 'Q';
res.push_back(tmp);
}
浙公网安备 33010602011771号