【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); }