0%

LeetCode 51. N皇后

题目描述

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],

["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

题解

依次指定第一行的第i个位置为Queen,做深度遍历,找出下一行与之前位置横竖斜线不在一个方向的位置,如果找到则继续,找不到则回滚。

代码

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ret;
if (n == 1) {
ret.push_back(vector<string>{"Q"});
return ret;
}
if (n <= 3) {
return ret;
}
for (auto col = 0; col < n; ++col) {
auto row = vector<int>{col};
getQueenRow(n, ret, row);
}
return ret;
}

inline int getDiagL(int row, int col, int n = 0) {
return row + col;
}
inline int getDiagR(int row, int col, int n) {
return (n - 1 - row + col);
}
void getQueenRow(int n, vector<vector<string>>& list, vector<int>& rowList) {
auto idx = (int)(rowList.size());
if (idx == n) {
auto ret = convertBoard(rowList);
list.push_back(ret);
return;
}
auto targetRow = idx;
for (auto targetCol = 0; targetCol < n; ++targetCol) {
auto targetDiagL = getDiagL(targetRow, targetCol);
auto targetDiagR = getDiagR(targetRow, targetCol, n);
auto isValid = true;
for (auto row = 0; row < targetRow; ++row) {
if (row == targetRow) {
isValid = false;
break;
}
auto col = rowList[row];
if (col == targetCol) {
isValid = false;
break;
}
auto diagL = getDiagL(row, col);
if (diagL == targetDiagL) {
isValid = false;
break;
}
auto diagR = getDiagR(row, col, n);
if (diagR == targetDiagR) {
isValid = false;
break;
}
}
if (isValid) {
rowList.push_back(targetCol);
getQueenRow(n, list, rowList);
rowList.pop_back();
}
}
}
vector<string> convertBoard(const vector<int>& rowList) {
vector<string> ret;
auto size = rowList.size();
for (auto i = 0; i < size; ++i) {
string str;
for (auto j = 0; j < size; ++j) {
str += (j == rowList[i]) ? 'Q' : '.';
}
ret.push_back(str);
}
return ret;
}

};