51. N 皇后

Problem: 51. N 皇后

Reference

https://www.programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html

思路

使用回溯算法解题。

具体还得看图。

image.png

二维的图形没有一维的数组好描述,先这样。

重要的是判断合法,判断合法中只需要遍历行是否有’Q’就可以了,因为列在外层遍历了。

同时判断左上角斜线和右上角斜线有没有’Q’,这里只要从当前元素往上走就可以了。
如下: 一个往走上走判断是否越界,一个往右上走是否越界,这里要注意,往右上走,行是减少,列是增加

最后初始化棋盘的时候,注意string的初始化方式,std::string(n, '.')

1
2
3
4
5
6
7
8
9
10
// 左上角
for (int i = row - 1,j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (chessbroad[i][j] == 'Q')
return false;
}
// 右上角
for (int i = row - 1,j = col + 1; i >= 0 && j < n; i--, j++) {
if (chessbroad[i][j] == 'Q')
return false;
}

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
public:
vector<vector<string>> res;
void backTracing(int n, int row, vector<string> chessbroad) {
if (row == n) {
res.push_back(chessbroad);
return;
}
for (int col = 0; col < n; col++) {
if (isValidate(row, col, chessbroad, n)) {
chessbroad[row][col] = 'Q';
backTracing(n, row + 1, chessbroad);
chessbroad[row][col] = '.';
}
}
}
bool isValidate(int row, int col, vector<string> chessbroad, int n) {
for (int i = 0; i < n; i++) {
if (chessbroad[i][col] == 'Q') {
return false;
}
}
// 左上角
for (int i = row - 1,j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (chessbroad[i][j] == 'Q')
return false;
}
// 右上角
for (int i = row - 1,j = col + 1; i >= 0 && j < n; i--, j++) {
if (chessbroad[i][j] == 'Q')
return false;
}
return true;
}
vector<vector<string>> solveNQueens(int n) {
vector<string> chessbroad(n, std::string(n, '.'));
backTracing(n, 0, chessbroad);
return res;
}
};