Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 139 additions & 2 deletions
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‎

Lines changed: 135 additions & 2 deletions
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
### **...**
Lines changed: 31 additions & 0 deletions
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+
};
Lines changed: 35 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /