N-Queens
深搜:
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > result;
vector<int> path;
dfs(n,result,path,0);
return result;
}
// 放第i行的queen(0 <= i <= n - 1),有n种放法(0 <= j <= n - 1)
void dfs(int n,vector<vector<string> > &result,vector<int> &path,int i)
{
if(i==n)
{
vector<string> res;
for(int j=0;j<n;++j)
{
string s(n,'.');
s[path[j]]='Q';
res.push_back(s);
}
result.push_back(res);
return;
}
for(int j=0;j<n;++j)
{
path.push_back(j);
if(isValid(path,i))dfs(n,result,path,i+1);
path.pop_back();
}
}
bool isValid(vector<int> &path,int i)
{
for(int j=0;j<i;++j)
{
if(path[i]==path[j]||abs(i-j)==abs(path[i]-path[j]))return false;
}
return true;
}
};
N-Queens II
深搜:
class Solution {
public:
int totalNQueens(int n) {
int result=0;
vector<int> path;
dfs(n,result,path,0);
return result;
}
void dfs(int n,int &result,vector<int> &path,int i)
{
if(i==n)
{
++result;
return;
}
for(int j=0;j<n;++j)
{
path.push_back(j);
if(isValid(path,i))dfs(n,result,path,i+1);
path.pop_back();
}
}
bool isValid(vector<int> &path,int i)
{
for(int j=0;j<i;++j)
{
if(path[i]==path[j]||abs(i-j)==abs(path[i]-path[j]))return false;
}
return true;
}
};