您的位置:首页 > 产品设计 > UI/UE

Leetcode dfs N-Queens II

2014-09-10 09:11 120 查看


N-Queens II

 Total Accepted: 12668 Total
Submissions: 38109My Submissions

Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.



题意:返回n皇后问题的所有可能解的总数

思路:dfs

因为只要求给出所有可能数的总数,所以当dfs遍历到叶子结点的时候,只要把表示

总数的变量加1就可以了。

这道题设置了额外的三个bool数组分别表示某一列,

某一主对角线,某一副对角线是否已经有皇后占据着。

由某个坐标(i,j),可得到它的主对角线是i+j,它的副对角线是i-j,

由于i-j可能是负数,所以我们给它加上 n,保证它不为负数

复杂度:O(n!),空间O(n)
int _n;
vector<bool> is_col_chosen;
vector<bool> is_main_diag_chosen;
vector<bool> is_anti_diag_chosen;
int c;
bool is_chosen(int i, int j){
return is_col_chosen[j] || is_main_diag_chosen[i + j] || is_anti_diag_chosen[i - j + _n];
}

void dfs(int nth_queen, vector<int> &columns){
if(nth_queen == _n){
c++;
}
for(int j = 0; j < _n; ++j){
if(!is_chosen(nth_queen, j)){
is_col_chosen[j] = is_main_diag_chosen[nth_queen + j] = is_anti_diag_chosen[nth_queen - j + _n] = true;
columns.push_back(j);
dfs(nth_queen + 1,columns);
columns.pop_back();
is_col_chosen[j] = is_main_diag_chosen[nth_queen + j] = is_anti_diag_chosen[nth_queen - j + _n] = false;
}
}
}

int totalNQueens(int n){
c = 0;
_n = n;
is_col_chosen = is_main_diag_chosen = is_anti_diag_chosen = vector<bool>(2 * n, false);
vector<int> columns;
dfs(0, columns);
return c;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: