Leetcode dfs N-Queens II
2014-09-10 09:11
120 查看
N-Queens II
Total Accepted: 12668 TotalSubmissions: 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;
}
相关文章推荐
- [Leetcode] N-Queens II
- N-Queens II
- N-Queens II
- N-Queens II
- N-Queens II
- LeetCode N-Queens II
- LeetCode-N-Queens II
- N-Queens II
- Leetcode:N-Queens II
- N-Queens II
- LeetCode 52.N-Queens II
- [LeetCode][JavaScript]N-Queens II
- leetcode 052 —— N-Queens II
- N-Queens II
- LeetCode---N-Queens II
- leetcode:N-Queens II
- Leet Code 52 N-Queens II - N皇后问题 - Java
- leetcode N-Queens II
- LeetCode 52. N-Queens II 题解(C++)
- 89. Gray Code \ 51. N-Queens \ 52. N-Queens II