Skip to content

Commit 17fb135

Browse files
committed
feat: add solutions to lc/lcof2/lcci problems
1 parent b8e4840 commit 17fb135

File tree

26 files changed

+1333
-122
lines changed

26 files changed

+1333
-122
lines changed

lcci/08.12.Eight Queens/README.md

+139-1
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,160 @@
3131

3232
<!-- 这里可写通用的实现逻辑 -->
3333

34+
深度优先搜索 + 剪枝。
35+
3436
<!-- tabs:start -->
3537

3638
### **Python3**
3739

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

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

4467
### **Java**
4568

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

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

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

52190
### **...**

lcci/08.12.Eight Queens/README_EN.md

+135-1
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,152 @@
4444

4545
## Solutions
4646

47+
DFS.
48+
4749
<!-- tabs:start -->
4850

4951
### **Python3**
5052

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

5578
### **Java**
5679

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

155+
### **Go**
156+
157+
```go
158+
func solveNQueens(n int) [][]string {
159+
res := [][]string{}
160+
g := make([][]string, n)
161+
for i := range g {
162+
g[i] = make([]string, n)
163+
for j := range g[i] {
164+
g[i][j] = "."
165+
}
166+
}
167+
col := make([]bool, n)
168+
dg := make([]bool, 2*n)
169+
udg := make([]bool, 2*n)
170+
dfs(0, n, col, dg, udg, g, &res)
171+
return res
172+
}
173+
174+
func dfs(u, n int, col, dg, udg []bool, g [][]string, res *[][]string) {
175+
if u == n {
176+
t := make([]string, n)
177+
for i := 0; i < n; i++ {
178+
t[i] = strings.Join(g[i], "")
179+
}
180+
*res = append(*res, t)
181+
return
182+
}
183+
for i := 0; i < n; i++ {
184+
if !col[i] && !dg[u+i] && !udg[n-u+i] {
185+
g[u][i] = "Q"
186+
col[i], dg[u+i], udg[n-u+i] = true, true, true
187+
dfs(u+1, n, col, dg, udg, g, res)
188+
g[u][i] = "."
189+
col[i], dg[u+i], udg[n-u+i] = false, false, false
190+
}
191+
}
192+
}
59193
```
60194

61195
### **...**

lcci/08.12.Eight Queens/Solution.cpp

+31
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+
};

lcci/08.12.Eight Queens/Solution.cs

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System.Collections.Generic;
2+
using System.Text;
3+
4+
public class Solution {
5+
private IList<IList<string>> results = new List<IList<string>>();
6+
private int n;
7+
8+
public IList<IList<string>> SolveNQueens(int n) {
9+
this.n = n;
10+
Search(new List<int>(), 0, 0, 0);
11+
return results;
12+
}
13+
14+
private void Search(IList<int> state, int left, int right, int vertical)
15+
{
16+
if (state.Count == n)
17+
{
18+
Print(state);
19+
return;
20+
}
21+
int available = ~(left | right | vertical) & ((1 << n) - 1);
22+
while (available != 0)
23+
{
24+
int x = available & -available;
25+
state.Add(x);
26+
Search(state, (left | x ) << 1, (right | x ) >> 1, vertical | x);
27+
state.RemoveAt(state.Count - 1);
28+
available &= ~x;
29+
}
30+
}
31+
32+
private void Print(IList<int> state)
33+
{
34+
var result = new List<string>();
35+
var sb = new StringBuilder(n);
36+
foreach (var s in state)
37+
{
38+
var x = s;
39+
for (var i = 0; i < n; ++i)
40+
{
41+
sb.Append((x & 1) != 0 ? 'Q': '.');
42+
x >>= 1;
43+
}
44+
result.Add(sb.ToString());
45+
sb.Clear();
46+
}
47+
results.Add(result);
48+
}
49+
}

0 commit comments

Comments
 (0)