Skip to content

Commit b8e4840

Browse files
committed
feat: add solutions to lc problem: No.0051.N-Queens
1 parent c3c3170 commit b8e4840

File tree

6 files changed

+389
-34
lines changed

6 files changed

+389
-34
lines changed

solution/0000-0099/0051.N-Queens/README.md

+139-2
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,164 @@
4242
</div>
4343
</div>
4444

45-
4645
## 解法
4746

4847
<!-- 这里可写通用的实现逻辑 -->
4948

49+
深度优先搜索 + 剪枝。
50+
5051
<!-- tabs:start -->
5152

5253
### **Python3**
5354

5455
<!-- 这里可写当前语言的特殊实现逻辑 -->
5556

5657
```python
57-
58+
class Solution:
59+
def solveNQueens(self, n: int) -> List[List[str]]:
60+
res = []
61+
g = [['.'] * n for _ in range(n)]
62+
col = [False] * n
63+
dg = [False] * (2 * n)
64+
udg = [False] * (2 * n)
65+
66+
def dfs(u):
67+
if u == n:
68+
res.append([''.join(item) for item in g])
69+
return
70+
for i in range(n):
71+
if not col[i] and not dg[u + i] and not udg[n - u + i]:
72+
g[u][i] = 'Q'
73+
col[i] = dg[u + i] = udg[n - u + i] = True
74+
dfs(u + 1)
75+
g[u][i] = '.'
76+
col[i] = dg[u + i] = udg[n - u + i] = False
77+
78+
dfs(0)
79+
return res
5880
```
5981

6082
### **Java**
6183

6284
<!-- 这里可写当前语言的特殊实现逻辑 -->
6385

6486
```java
87+
class Solution {
88+
public List<List<String>> solveNQueens(int n) {
89+
List<List<String>> res = new ArrayList<>();
90+
String[][] g = new String[n][n];
91+
for (int i = 0; i < n; ++i) {
92+
String[] t = new String[n];
93+
Arrays.fill(t, ".");
94+
g[i] = t;
95+
}
96+
// 列是否已经有值
97+
boolean[] col = new boolean[n];
98+
// 斜线是否已经有值
99+
boolean[] dg = new boolean[2 * n];
100+
// 反斜线是否已经有值
101+
boolean[] udg = new boolean[2 * n];
102+
// 从第一行开始搜索
103+
dfs(0, n, col, dg, udg, g, res);
104+
return res;
105+
}
106+
107+
private void dfs(int u, int n, boolean[] col, boolean[] dg, boolean[] udg, String[][] g, List<List<String>> res) {
108+
if (u == n) {
109+
List<String> t = new ArrayList<>();
110+
for (String[] e : g) {
111+
t.add(String.join("", e));
112+
}
113+
res.add(t);
114+
return;
115+
}
116+
for (int i = 0; i < n; ++i) {
117+
if (!col[i] && !dg[u + i] && !udg[n - u + i]) {
118+
g[u][i] = "Q";
119+
col[i] = dg[u + i] = udg[n - u + i] = true;
120+
dfs(u + 1, n, col, dg, udg, g, res);
121+
g[u][i] = ".";
122+
col[i] = dg[u + i] = udg[n - u + i] = false;
123+
}
124+
}
125+
}
126+
}
127+
```
128+
129+
### **C++**
130+
131+
```cpp
132+
class Solution {
133+
public:
134+
vector<vector<string>> solveNQueens(int n) {
135+
vector<vector<string>> res;
136+
vector<string> g(n, string(n, '.'));
137+
vector<bool> col(n, false);
138+
vector<bool> dg(2 * n, false);
139+
vector<bool> udg(2 * n, false);
140+
dfs(0, n, col, dg, udg, g, res);
141+
return res;
142+
}
143+
144+
void dfs(int u, int n, vector<bool>& col, vector<bool>& dg, vector<bool>& udg, vector<string>& g, vector<vector<string>>& res) {
145+
if (u == n)
146+
{
147+
res.push_back(g);
148+
return;
149+
}
150+
for (int i = 0; i < n; ++i)
151+
{
152+
if (!col[i] && !dg[u + i] && !udg[n - u + i])
153+
{
154+
g[u][i] = 'Q';
155+
col[i] = dg[u + i] = udg[n - u + i] = true;
156+
dfs(u + 1, n, col, dg, udg, g, res);
157+
g[u][i] = '.';
158+
col[i] = dg[u + i] = udg[n - u + i] = false;
159+
}
160+
}
161+
}
162+
};
163+
```
65164

165+
### **Go**
166+
167+
```go
168+
func solveNQueens(n int) [][]string {
169+
res := [][]string{}
170+
g := make([][]string, n)
171+
for i := range g {
172+
g[i] = make([]string, n)
173+
for j := range g[i] {
174+
g[i][j] = "."
175+
}
176+
}
177+
col := make([]bool, n)
178+
dg := make([]bool, 2*n)
179+
udg := make([]bool, 2*n)
180+
dfs(0, n, col, dg, udg, g, &res)
181+
return res
182+
}
183+
184+
func dfs(u, n int, col, dg, udg []bool, g [][]string, res *[][]string) {
185+
if u == n {
186+
t := make([]string, n)
187+
for i := 0; i < n; i++ {
188+
t[i] = strings.Join(g[i], "")
189+
}
190+
*res = append(*res, t)
191+
return
192+
}
193+
for i := 0; i < n; i++ {
194+
if !col[i] && !dg[u+i] && !udg[n-u+i] {
195+
g[u][i] = "Q"
196+
col[i], dg[u+i], udg[n-u+i] = true, true, true
197+
dfs(u+1, n, col, dg, udg, g, res)
198+
g[u][i] = "."
199+
col[i], dg[u+i], udg[n-u+i] = false, false, false
200+
}
201+
}
202+
}
66203
```
67204

68205
### **...**

solution/0000-0099/0051.N-Queens/README_EN.md

+135-2
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,154 @@
3333
<li><code>1 &lt;= n &lt;= 9</code></li>
3434
</ul>
3535

36-
3736
## Solutions
3837

38+
DFS.
39+
3940
<!-- tabs:start -->
4041

4142
### **Python3**
4243

4344
```python
44-
45+
class Solution:
46+
def solveNQueens(self, n: int) -> List[List[str]]:
47+
res = []
48+
g = [['.'] * n for _ in range(n)]
49+
col = [False] * n
50+
dg = [False] * (2 * n)
51+
udg = [False] * (2 * n)
52+
53+
def dfs(u):
54+
if u == n:
55+
res.append([''.join(item) for item in g])
56+
return
57+
for i in range(n):
58+
if not col[i] and not dg[u + i] and not udg[n - u + i]:
59+
g[u][i] = 'Q'
60+
col[i] = dg[u + i] = udg[n - u + i] = True
61+
dfs(u + 1)
62+
g[u][i] = '.'
63+
col[i] = dg[u + i] = udg[n - u + i] = False
64+
65+
dfs(0)
66+
return res
4567
```
4668

4769
### **Java**
4870

4971
```java
72+
class Solution {
73+
public List<List<String>> solveNQueens(int n) {
74+
List<List<String>> res = new ArrayList<>();
75+
String[][] g = new String[n][n];
76+
for (int i = 0; i < n; ++i) {
77+
String[] t = new String[n];
78+
Arrays.fill(t, ".");
79+
g[i] = t;
80+
}
81+
boolean[] col = new boolean[n];
82+
boolean[] dg = new boolean[2 * n];
83+
boolean[] udg = new boolean[2 * n];
84+
dfs(0, n, col, dg, udg, g, res);
85+
return res;
86+
}
87+
88+
private void dfs(int u, int n, boolean[] col, boolean[] dg, boolean[] udg, String[][] g, List<List<String>> res) {
89+
if (u == n) {
90+
List<String> t = new ArrayList<>();
91+
for (String[] e : g) {
92+
t.add(String.join("", e));
93+
}
94+
res.add(t);
95+
return;
96+
}
97+
for (int i = 0; i < n; ++i) {
98+
if (!col[i] && !dg[u + i] && !udg[n - u + i]) {
99+
g[u][i] = "Q";
100+
col[i] = dg[u + i] = udg[n - u + i] = true;
101+
dfs(u + 1, n, col, dg, udg, g, res);
102+
g[u][i] = ".";
103+
col[i] = dg[u + i] = udg[n - u + i] = false;
104+
}
105+
}
106+
}
107+
}
108+
```
109+
110+
### **C++**
111+
112+
```cpp
113+
class Solution {
114+
public:
115+
vector<vector<string>> solveNQueens(int n) {
116+
vector<vector<string>> res;
117+
vector<string> g(n, string(n, '.'));
118+
vector<bool> col(n, false);
119+
vector<bool> dg(2 * n, false);
120+
vector<bool> udg(2 * n, false);
121+
dfs(0, n, col, dg, udg, g, res);
122+
return res;
123+
}
124+
125+
void dfs(int u, int n, vector<bool>& col, vector<bool>& dg, vector<bool>& udg, vector<string>& g, vector<vector<string>>& res) {
126+
if (u == n)
127+
{
128+
res.push_back(g);
129+
return;
130+
}
131+
for (int i = 0; i < n; ++i)
132+
{
133+
if (!col[i] && !dg[u + i] && !udg[n - u + i])
134+
{
135+
g[u][i] = 'Q';
136+
col[i] = dg[u + i] = udg[n - u + i] = true;
137+
dfs(u + 1, n, col, dg, udg, g, res);
138+
g[u][i] = '.';
139+
col[i] = dg[u + i] = udg[n - u + i] = false;
140+
}
141+
}
142+
}
143+
};
144+
```
50145

146+
### **Go**
147+
148+
```go
149+
func solveNQueens(n int) [][]string {
150+
res := [][]string{}
151+
g := make([][]string, n)
152+
for i := range g {
153+
g[i] = make([]string, n)
154+
for j := range g[i] {
155+
g[i][j] = "."
156+
}
157+
}
158+
col := make([]bool, n)
159+
dg := make([]bool, 2*n)
160+
udg := make([]bool, 2*n)
161+
dfs(0, n, col, dg, udg, g, &res)
162+
return res
163+
}
164+
165+
func dfs(u, n int, col, dg, udg []bool, g [][]string, res *[][]string) {
166+
if u == n {
167+
t := make([]string, n)
168+
for i := 0; i < n; i++ {
169+
t[i] = strings.Join(g[i], "")
170+
}
171+
*res = append(*res, t)
172+
return
173+
}
174+
for i := 0; i < n; i++ {
175+
if !col[i] && !dg[u+i] && !udg[n-u+i] {
176+
g[u][i] = "Q"
177+
col[i], dg[u+i], udg[n-u+i] = true, true, true
178+
dfs(u+1, n, col, dg, udg, g, res)
179+
g[u][i] = "."
180+
col[i], dg[u+i], udg[n-u+i] = false, false, false
181+
}
182+
}
183+
}
51184
```
52185

53186
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public:
3+
vector<vector<string>> solveNQueens(int n) {
4+
vector<vector<string>> res;
5+
vector<string> g(n, string(n, '.'));
6+
vector<bool> col(n, false);
7+
vector<bool> dg(2 * n, false);
8+
vector<bool> udg(2 * n, false);
9+
dfs(0, n, col, dg, udg, g, res);
10+
return res;
11+
}
12+
13+
void dfs(int u, int n, vector<bool>& col, vector<bool>& dg, vector<bool>& udg, vector<string>& g, vector<vector<string>>& res) {
14+
if (u == n)
15+
{
16+
res.push_back(g);
17+
return;
18+
}
19+
for (int i = 0; i < n; ++i)
20+
{
21+
if (!col[i] && !dg[u + i] && !udg[n - u + i])
22+
{
23+
g[u][i] = 'Q';
24+
col[i] = dg[u + i] = udg[n - u + i] = true;
25+
dfs(u + 1, n, col, dg, udg, g, res);
26+
g[u][i] = '.';
27+
col[i] = dg[u + i] = udg[n - u + i] = false;
28+
}
29+
}
30+
}
31+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
func solveNQueens(n int) [][]string {
2+
res := [][]string{}
3+
g := make([][]string, n)
4+
for i := range g {
5+
g[i] = make([]string, n)
6+
for j := range g[i] {
7+
g[i][j] = "."
8+
}
9+
}
10+
col := make([]bool, n)
11+
dg := make([]bool, 2*n)
12+
udg := make([]bool, 2*n)
13+
dfs(0, n, col, dg, udg, g, &res)
14+
return res
15+
}
16+
17+
func dfs(u, n int, col, dg, udg []bool, g [][]string, res *[][]string) {
18+
if u == n {
19+
t := make([]string, n)
20+
for i := 0; i < n; i++ {
21+
t[i] = strings.Join(g[i], "")
22+
}
23+
*res = append(*res, t)
24+
return
25+
}
26+
for i := 0; i < n; i++ {
27+
if !col[i] && !dg[u+i] && !udg[n-u+i] {
28+
g[u][i] = "Q"
29+
col[i], dg[u+i], udg[n-u+i] = true, true, true
30+
dfs(u+1, n, col, dg, udg, g, res)
31+
g[u][i] = "."
32+
col[i], dg[u+i], udg[n-u+i] = false, false, false
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)