題目: LeetCode - 51. N-Queens

解題思路

列為單位,上而下 DFS 模擬。

參考解法

C++

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
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> results;
vector<string> queens(n, string(n, '.'));
dfs(n, 0, queens, results);
return results;
}

void dfs(int n, int currRow, vector<string>& queens, vector<vector<string>>& results) {
if (currRow == n) {
results.push_back(queens);
return;
}

for (int i = 0; i < n; ++i) {
if (isValid(n, queens, currRow, i)) {
queens[currRow][i] = 'Q';
dfs(n, currRow + 1, queens, results);
queens[currRow][i] = '.';
}
}
}

// row, col: new queen's position
bool isValid(int n, vector<string>& queens, int row, int col) {
// check if queen on the same columns
for (int i = 0; i < row; ++i) {
if (queens[i][col] == 'Q') {
return false;
}
}

// check if queen on left-top
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j) {
if (queens[i][j] == 'Q') {
return false;
}
}

// check if queen on right-top
for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j) {
if (queens[i][j] == 'Q') {
return false;
}
}

return true;
}
};

Python

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
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
results = []
queens = [['.'] * n for _ in range(n)]
self.dfs(n, 0, queens, results)
return results

def dfs(self, n, currRow, queens, results):
if currRow == n:
results.append([''.join(i) for i in queens])
return

for i in range(n):
if self.isValid(n, queens, currRow, i):
queens[currRow][i] = 'Q'
self.dfs(n, currRow + 1, queens, results)
queens[currRow][i] = '.'

def isValid(self, n, queens, row, col):
"""
row, col: new queen's position
"""
# check if queen on the same columns
for i in range(row):
if queens[i][col] == 'Q':
return False

# check if queen on left-top
i, j = row - 1, col - 1
while i >= 0 and j >= 0:
if queens[i][j] == 'Q':
return False
i -= 1
j -= 1

# check if queen on right-top
i, j = row - 1, col + 1
while i >= 0 and j < n:
if queens[i][j] == 'Q':
return False
i -= 1
j += 1

return True