Skip to content

Commit dae8198

Browse files
committed
feat: add solutions to lc problem: No.0052
No.0052.N-Queens II
1 parent 6e598c8 commit dae8198

File tree

7 files changed

+328
-23
lines changed

7 files changed

+328
-23
lines changed

solution/0000-0099/0052.N-Queens II/README.md

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,145 @@
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46+
**方法一:回溯**
47+
48+
我们设计一个函数 $dfs(i)$,表示从第 $i$ 行开始搜索,搜索到的结果累加到答案中。
49+
50+
在第 $i$ 行,我们枚举第 $i$ 行的每一列,如果当前列不与前面已经放置的皇后发生冲突,那么我们就可以放置一个皇后,然后继续搜索下一行,即调用 $dfs(i + 1)$。
51+
52+
如果发生冲突,那么我们就跳过当前列,继续枚举下一列。
53+
54+
判断是否发生冲突,我们需要用三个数组分别记录每一列、每一条正对角线、每一条反对角线是否已经放置了皇后。
55+
56+
具体地,我们用 $cols$ 数组记录每一列是否已经放置了皇后,用 $dg$ 数组记录每一条正对角线是否已经放置了皇后,用 $udg$ 数组记录每一条反对角线是否已经放置了皇后。
57+
58+
时间复杂度 $O(n!)$,空间复杂度 $O(n)$。其中 $n$ 是皇后的数量。
59+
4660
<!-- tabs:start -->
4761

4862
### **Python3**
4963

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

5266
```python
53-
67+
class Solution:
68+
def totalNQueens(self, n: int) -> int:
69+
def dfs(i):
70+
if i == n:
71+
nonlocal ans
72+
ans += 1
73+
return
74+
for j in range(n):
75+
a, b = i + j, i - j + n
76+
if cols[j] or dg[a] or udg[b]:
77+
continue
78+
cols[j] = dg[a] = udg[b] = True
79+
dfs(i + 1)
80+
cols[j] = dg[a] = udg[b] = False
81+
82+
cols = [False] * 10
83+
dg = [False] * 20
84+
udg = [False] * 20
85+
ans = 0
86+
dfs(0)
87+
return ans
5488
```
5589

5690
### **Java**
5791

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

6094
```java
95+
class Solution {
96+
private int n;
97+
private int ans;
98+
private boolean[] cols = new boolean[10];
99+
private boolean[] dg = new boolean[20];
100+
private boolean[] udg = new boolean[20];
101+
102+
public int totalNQueens(int n) {
103+
this.n = n;
104+
dfs(0);
105+
return ans;
106+
}
107+
108+
private void dfs(int i) {
109+
if (i == n) {
110+
++ans;
111+
return;
112+
}
113+
for (int j = 0; j < n; ++j) {
114+
int a = i + j, b = i - j + n;
115+
if (cols[j] || dg[a] || udg[b]) {
116+
continue;
117+
}
118+
cols[j] = true;
119+
dg[a] = true;
120+
udg[b] = true;
121+
dfs(i + 1);
122+
cols[j] = false;
123+
dg[a] = false;
124+
udg[b] = false;
125+
}
126+
}
127+
}
128+
```
129+
130+
### **C++**
131+
132+
```cpp
133+
class Solution {
134+
public:
135+
int totalNQueens(int n) {
136+
bitset<10> cols;
137+
bitset<20> dg;
138+
bitset<20> udg;
139+
int ans = 0;
140+
function<void(int)> dfs = [&](int i) {
141+
if (i == n) {
142+
++ans;
143+
return;
144+
}
145+
for (int j = 0; j < n; ++j) {
146+
int a = i + j, b = i - j + n;
147+
if (cols[j] || dg[a] || udg[b]) continue;
148+
cols[j] = dg[a] = udg[b] = 1;
149+
dfs(i + 1);
150+
cols[j] = dg[a] = udg[b] = 0;
151+
}
152+
};
153+
dfs(0);
154+
return ans;
155+
}
156+
};
157+
```
61158
159+
### **Go**
160+
161+
```go
162+
func totalNQueens(n int) (ans int) {
163+
cols := [10]bool{}
164+
dg := [20]bool{}
165+
udg := [20]bool{}
166+
var dfs func(int)
167+
dfs = func(i int) {
168+
if i == n {
169+
ans++
170+
return
171+
}
172+
for j := 0; j < n; j++ {
173+
a, b := i+j, i-j+n
174+
if cols[j] || dg[a] || udg[b] {
175+
continue
176+
}
177+
cols[j], dg[a], udg[b] = true, true, true
178+
dfs(i + 1)
179+
cols[j], dg[a], udg[b] = false, false, false
180+
}
181+
}
182+
dfs(0)
183+
return
184+
}
62185
```
63186

64187
### **...**

solution/0000-0099/0052.N-Queens II/README_EN.md

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,122 @@
3838
### **Python3**
3939

4040
```python
41-
41+
class Solution:
42+
def totalNQueens(self, n: int) -> int:
43+
def dfs(i):
44+
if i == n:
45+
nonlocal ans
46+
ans += 1
47+
return
48+
for j in range(n):
49+
a, b = i + j, i - j + n
50+
if cols[j] or dg[a] or udg[b]:
51+
continue
52+
cols[j] = dg[a] = udg[b] = True
53+
dfs(i + 1)
54+
cols[j] = dg[a] = udg[b] = False
55+
56+
cols = [False] * 10
57+
dg = [False] * 20
58+
udg = [False] * 20
59+
ans = 0
60+
dfs(0)
61+
return ans
4262
```
4363

4464
### **Java**
4565

4666
```java
67+
class Solution {
68+
private int n;
69+
private int ans;
70+
private boolean[] cols = new boolean[10];
71+
private boolean[] dg = new boolean[20];
72+
private boolean[] udg = new boolean[20];
73+
74+
public int totalNQueens(int n) {
75+
this.n = n;
76+
dfs(0);
77+
return ans;
78+
}
79+
80+
private void dfs(int i) {
81+
if (i == n) {
82+
++ans;
83+
return;
84+
}
85+
for (int j = 0; j < n; ++j) {
86+
int a = i + j, b = i - j + n;
87+
if (cols[j] || dg[a] || udg[b]) {
88+
continue;
89+
}
90+
cols[j] = true;
91+
dg[a] = true;
92+
udg[b] = true;
93+
dfs(i + 1);
94+
cols[j] = false;
95+
dg[a] = false;
96+
udg[b] = false;
97+
}
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int totalNQueens(int n) {
108+
bitset<10> cols;
109+
bitset<20> dg;
110+
bitset<20> udg;
111+
int ans = 0;
112+
function<void(int)> dfs = [&](int i) {
113+
if (i == n) {
114+
++ans;
115+
return;
116+
}
117+
for (int j = 0; j < n; ++j) {
118+
int a = i + j, b = i - j + n;
119+
if (cols[j] || dg[a] || udg[b]) continue;
120+
cols[j] = dg[a] = udg[b] = 1;
121+
dfs(i + 1);
122+
cols[j] = dg[a] = udg[b] = 0;
123+
}
124+
};
125+
dfs(0);
126+
return ans;
127+
}
128+
};
129+
```
47130
131+
### **Go**
132+
133+
```go
134+
func totalNQueens(n int) (ans int) {
135+
cols := [10]bool{}
136+
dg := [20]bool{}
137+
udg := [20]bool{}
138+
var dfs func(int)
139+
dfs = func(i int) {
140+
if i == n {
141+
ans++
142+
return
143+
}
144+
for j := 0; j < n; j++ {
145+
a, b := i+j, i-j+n
146+
if cols[j] || dg[a] || udg[b] {
147+
continue
148+
}
149+
cols[j], dg[a], udg[b] = true, true, true
150+
dfs(i + 1)
151+
cols[j], dg[a], udg[b] = false, false, false
152+
}
153+
}
154+
dfs(0)
155+
return
156+
}
48157
```
49158

50159
### **...**
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
int totalNQueens(int n) {
4+
bitset<10> cols;
5+
bitset<20> dg;
6+
bitset<20> udg;
7+
int ans = 0;
8+
function<void(int)> dfs = [&](int i) {
9+
if (i == n) {
10+
++ans;
11+
return;
12+
}
13+
for (int j = 0; j < n; ++j) {
14+
int a = i + j, b = i - j + n;
15+
if (cols[j] || dg[a] || udg[b]) continue;
16+
cols[j] = dg[a] = udg[b] = 1;
17+
dfs(i + 1);
18+
cols[j] = dg[a] = udg[b] = 0;
19+
}
20+
};
21+
dfs(0);
22+
return ans;
23+
}
24+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func totalNQueens(n int) (ans int) {
2+
cols := [10]bool{}
3+
dg := [20]bool{}
4+
udg := [20]bool{}
5+
var dfs func(int)
6+
dfs = func(i int) {
7+
if i == n {
8+
ans++
9+
return
10+
}
11+
for j := 0; j < n; j++ {
12+
a, b := i+j, i-j+n
13+
if cols[j] || dg[a] || udg[b] {
14+
continue
15+
}
16+
cols[j], dg[a], udg[b] = true, true, true
17+
dfs(i + 1)
18+
cols[j], dg[a], udg[b] = false, false, false
19+
}
20+
}
21+
dfs(0)
22+
return
23+
}
Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,33 @@
11
class Solution {
2-
3-
int count = 0;
2+
private int n;
3+
private int ans;
4+
private boolean[] cols = new boolean[10];
5+
private boolean[] dg = new boolean[20];
6+
private boolean[] udg = new boolean[20];
47

58
public int totalNQueens(int n) {
6-
int[] c = new int[n];
7-
search(0, n, c);
8-
return count;
9+
this.n = n;
10+
dfs(0);
11+
return ans;
912
}
1013

11-
public void search(int cur, int n, int[] c) {
12-
if (cur == n) {
13-
count++;
14+
private void dfs(int i) {
15+
if (i == n) {
16+
++ans;
1417
return;
1518
}
16-
17-
for (int i = 0; i < n; i++) {
18-
boolean flag = true;
19-
c[cur] = i;
20-
for (int j = 0; j < cur; j++) {
21-
if ((c[cur] == c[j]) || ((c[cur] - cur) == (c[j] - j))
22-
|| ((c[cur] + cur) == (c[j] + j))) {
23-
flag = false;
24-
break;
25-
}
19+
for (int j = 0; j < n; ++j) {
20+
int a = i + j, b = i - j + n;
21+
if (cols[j] || dg[a] || udg[b]) {
22+
continue;
2623
}
27-
if (flag) search(cur + 1, n, c);
24+
cols[j] = true;
25+
dg[a] = true;
26+
udg[b] = true;
27+
dfs(i + 1);
28+
cols[j] = false;
29+
dg[a] = false;
30+
udg[b] = false;
2831
}
2932
}
3033
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def totalNQueens(self, n: int) -> int:
3+
def dfs(i):
4+
if i == n:
5+
nonlocal ans
6+
ans += 1
7+
return
8+
for j in range(n):
9+
a, b = i + j, i - j + n
10+
if cols[j] or dg[a] or udg[b]:
11+
continue
12+
cols[j] = dg[a] = udg[b] = True
13+
dfs(i + 1)
14+
cols[j] = dg[a] = udg[b] = False
15+
16+
cols = [False] * 10
17+
dg = [False] * 20
18+
udg = [False] * 20
19+
ans = 0
20+
dfs(0)
21+
return ans

0 commit comments

Comments
 (0)