题目
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
思路一
用一个NXN的 flag 矩阵记录可能每一个皇后可能的位置和不能的位置,分别是0和1 。
class Solution {
public:
int totalNQueens(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int>> result(n+1,vector<int>(n+1,0));
int num = 0;
myqueens(result,n,1,num);
return num;
}
void myqueens(vector<vector<int>> &vec, int n, int k, int &num)
{
if(k==n+1){
num = num+1;
return ;
}
int j=1;
for(j=1;j<=n;j++){
if(vec[k][j]==0){
vector<vector<int>> tmp = vec;
updateLocation(vec, k, j);
myqueens(vec, n, k+1, num);
vec = tmp;
}
}
if(j>n)
return ;
}
void updateLocation(vector<vector<int>> &vec, int x, int y){
for(int i=x;i<vec.size();i++) vec[i][y]=1;
for(int i=x,j=y;i<vec.size() && j>0;i++,j--) vec[i][j]=1;
for(int i=x,j=y;i<vec.size() && j<vec.size();i++,j++) vec[i][j]=1;
}
};
大数据 Run Status: Time Limit Exceeded
思路二
对于第 k 个皇后,只需要与前k-1个皇后的位置比较是否冲突即可,而且用一维数组只记录 y 的位置即可,x是数组的index 。
class Solution {
public:
int totalNQueens(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<int> result;
int num = 0;
myqueens(result,n,1,num);
return num;
}
void myqueens(vector<int> &vec, int n, int k, int &num)
{
if(k==n+1){
num = num+1;
return ;
}
int j=1;
for(j=1;j<=n;j++){
if(isCanloc(vec, k, j)){
vec.push_back(j);
myqueens(vec, n, k+1, num);
vec.pop_back();
}
}
if(j>n)
return ;
}
bool isCanloc(vector<int> &vec, int k, int j){
for(int i=0;i<vec.size();i++)
{
int x = i+1;
int y = vec[i];
if(j==y || k-x==j-y || x-k==j-y)
return false;
}
return true;
}
};
大数据可以通过,用时也比较多,Run Status: Accepted! Program Runtime: 1896 milli secs
将 判断是否冲突的时间消耗,降到了常数级。