The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
题意:返回n皇后问题的所有可能解
思路:dfs
要求给出所有可能解的题,一般采用dfs 暴力枚举
这道题设置了额外的三个bool数组分别表示某一列,
某一主对角线,某一副对角线是否已经有皇后占据着。
由某个坐标(i,j),可得到它的主对角线是i+j,它的副对角线是i-j,
由于i-j可能是负数,所以我们给它加上 n,保证它不为负数
复杂度:O(n!),空间O(n)
vector<vector<string> >res; int _n; vector<bool> is_col_chosen; vector<bool> is_main_diag_chosen; vector<bool> is_anti_diag_chosen; 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){ vector<string> one_res(_n, string(_n, '.')); int row = 0; for_each(one_res.begin(), one_res.end(), [&columns, &row](string &one_row){ one_row[columns[row++]] = 'Q'; }); res.push_back(one_res); } 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; } } } vector<vector<string> > solveNQueens(int n){ _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 res; }