题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
思路
代码
class Solution {
public:
int totalNQueens(int n) {
int count = 0;
vector<vector<int>> mask(n, vector<int>(n, 0));
generate(0, n, mask, count);
return count;
}
void generate(int k, int n, vector<vector<int>>& mask, int& count){
if (k == n){
count++;
return;
}
for (int i = 0; i < n; i++){
if (mask[k][i] == 0){
vector<vector<int>> mask_tmp = mask;
put_down_the_queen(k, i, mask);
generate(k+1, n, mask, count);
mask = mask_tmp;
}
}
}
void put_down_the_queen(int x, int y, vector<vector<int>>& mask){
static const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
static const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int n = mask.size();
mask[x][y] = 1;
for (int i = 1; i < n; i++)
for (int j = 0; j < 8; j++){
int new_x = x + i * dx[j];
int new_y = y + i * dy[j];
if (new_x >= 0 && new_x < n && new_y >= 0 && new_y < n)
mask[new_x][new_y] = 1;
}
}
};