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