题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
思路
(1)N皇后问题,首先每一行必有一个皇后,需要确定是皇后放在哪一列。
(2)如果皇后放在(x,y)位置了,那么其8个方向都不能放皇后了,用一个二维标记数组mask来记录。
(3)回溯确定每一行皇后放在哪一列的时候,要恢复mask。
代码
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<string> location(n, string(n, '.'));
vector<vector<int>> mask(n, vector<int>(n, 0));
generate(0, n, location, result, mask);
return result;
}
void generate(int k, int n, vector<string>& location, vector<vector<string>>& result, vector<vector<int>>& mask){
if (k == n){
result.push_back(location);
return;
}
for (int i = 0; i < n; i++){
if (mask[k][i] == 0){
vector<vector<int>> tmp_mask = mask;
location[k][i] = 'Q';
put_down_the_queen(k, i, mask);
generate(k+1, n, location, result, mask);
mask = tmp_mask;
location[k][i] = '.';
}
}
}
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};
mask[x][y] = 1;
int n = mask.size();
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;
}
}
}
};