N皇后

51. N 皇后 - 力扣(LeetCode)

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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

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

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

示例 1:

img

1
2
3
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

1
2
输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9
image-20231021000105664
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
class Solution {
List<List<String>> ans = new ArrayList<>();

public List<List<String>> solveNQueens(int n) {
char[][] chessboard = new char[n][n];
for(char[] chars : chessboard){
Arrays.fill(chars, '.');
}

traversal(chessboard, 0, n);
return ans;
}


public List<String> arrayToList(char[][] chessboard){
List<String> list = new ArrayList<>();
for(char[] chars : chessboard){
list.add(new String(chars));
}
return list;
}

public void traversal(char[][] chessboard, int row, int n){
if(row == n){
ans.add(arrayToList(chessboard));
}

for(int col = 0; col < n; col++){
if(isVaild(row, col, n, chessboard)){
chessboard[row][col] = 'Q';
traversal(chessboard, row + 1, n);
chessboard[row][col] = '.';
}
}
}


public boolean isVaild(int row, int col, int n, char[][] chessboard){
for(int i = 0; i < row; i++){ //检查同一列是否有Q
if(chessboard[i][col] == 'Q'){
return false;
}
}
//递归的for循环已经保证了同一行不可能重复

//检查左上斜边是否有Q
for(int i = row-1,j = col-1; i >= 0 && j >= 0; i--, j--){
if(chessboard[i][j] == 'Q'){
return false;
}
}

//检查右上斜边是否有Q
for(int i = row-1, j = col+1; i >= 0 && j <= n -1; i--, j++){
if(chessboard[i][j] == 'Q'){
return false;
}
}
return true;
}
}

N皇后
http://example.com/2023/05/10/算法/回溯/14. N皇后/
作者
PALE13
发布于
2023年5月10日
许可协议