-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution.java
60 lines (49 loc) · 1.71 KB
/
Solution.java
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
package L51;
import java.util.*;
class Solution {
final int N = 20;
List<List<String>> res = new ArrayList<>();//返回结果
boolean[] col, diagonal, rdiagonal;
public List<List<String>> solveNQueens(int n) {
char[][] g = new char[n][n];
col = new boolean[N];//标记行号
diagonal = new boolean[N];//标记对角线
rdiagonal = new boolean[N];//标记反对角线
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g[i][j] = '.';
}
}
dfs(0, n, g);
return res;
}
void dfs(int u, int n, char[][] g) {
if (u == n) {
List<String> single = new ArrayList<>();//存储单个棋盘
for (int i = 0; i < n; i++) {
single.add(new String(g[i]));//字符数组转换字符串
}
res.add(single);
return;
}
for (int i = 0; i < n; i++) {
if (!col[i] && !diagonal[u + i] && !rdiagonal[n - u + i]) {
g[u][i] = 'Q';//标记走过
col[i] = diagonal[u + i] = rdiagonal[n - u + i] = true;
dfs(u + 1, n, g);
g[u][i] = '.';//回溯恢复现场
col[i] = diagonal[u + i] = rdiagonal[n - u + i] = false;
}
}
}
public static void main(String[] args) {
Solution solution = new Solution();
List<List<String>> ans = solution.solveNQueens(4);
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans.get(i).size(); j++) {
System.out.println(ans.get(i).get(j) + " ");
}
System.out.println("====================");
}
}
}