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 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‎

Lines changed: 139 additions & 1 deletion
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‎

Lines changed: 135 additions & 1 deletion
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‎

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

‎lcci/08.12.Eight Queens/Solution.cs‎

Lines changed: 49 additions & 0 deletions
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)

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