Skip to content

Commit 5df105b

Browse files
committed
feat: add solutions to lc problem: No.0051
No.0051.N-Queens
1 parent 3cd9a0b commit 5df105b

File tree

9 files changed

+489
-317
lines changed

9 files changed

+489
-317
lines changed

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

+178-97
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,19 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50-
深度优先搜索 + 剪枝。
50+
**方法一:DFS(回溯)**
51+
52+
我们定义三个数组 $col$, $dg$ 和 $udg$,分别表示列、正对角线和反对角线上的是否有皇后,如果位置 $(i, j)$ 有皇后,那么 $col[j]$, $dg[i + j]$ 和 $udg[n - i + j]$ 都为 $1$。另外,我们用一个数组 $g$ 记录当前棋盘的状态,初始时 $g$ 中的所有元素都是 `'.'`
53+
54+
接下来,我们定义一个函数 $dfs(i)$,表示从第 $i$ 行开始放置皇后。
55+
56+
在 $dfs(i)$ 中,如果 $i=n$,说明我们已经完成了所有皇后的放置,我们将当前 $g$ 放入答案数组中,递归结束。
57+
58+
否则,我们枚举当前行的每一列 $j$,如果位置 $(i, j)$ 没有皇后,即 $col[j]$, $dg[i + j]$ 和 $udg[n - i + j]$ 都为 $0$,那么我们可以放置皇后,即把 $g[i][j]$ 改为 `'Q'`,并将 $col[j]$, $dg[i + j]$ 和 $udg[n - i + j]$ 都置为 $1$,然后继续搜索下一行,即调用 $dfs(i + 1)$,递归结束后,我们需要将 $g[i][j]$ 改回 `'.'` 并将 $col[j]$, $dg[i + j]$ 和 $udg[n - i + j]$ 都置为 $0$。
59+
60+
在主函数中,我们调用 $dfs(0)$ 开始递归,最后返回答案数组即可。
61+
62+
时间复杂度 $(n^2 \times n!)$,空间复杂度 $O(n)$。其中 $n$ 是题目给定的整数。
5163

5264
<!-- tabs:start -->
5365

@@ -58,26 +70,25 @@
5870
```python
5971
class Solution:
6072
def solveNQueens(self, n: int) -> List[List[str]]:
61-
res = []
62-
g = [['.'] * n for _ in range(n)]
63-
col = [False] * n
64-
dg = [False] * (2 * n)
65-
udg = [False] * (2 * n)
66-
67-
def dfs(u):
68-
if u == n:
69-
res.append([''.join(item) for item in g])
73+
def dfs(i: int):
74+
if i == n:
75+
ans.append(["".join(row) for row in g])
7076
return
71-
for i in range(n):
72-
if not col[i] and not dg[u + i] and not udg[n - u + i]:
73-
g[u][i] = 'Q'
74-
col[i] = dg[u + i] = udg[n - u + i] = True
75-
dfs(u + 1)
76-
g[u][i] = '.'
77-
col[i] = dg[u + i] = udg[n - u + i] = False
78-
77+
for j in range(n):
78+
if col[j] + dg[i + j] + udg[n - i + j] == 0:
79+
g[i][j] = "Q"
80+
col[j] = dg[i + j] = udg[n - i + j] = 1
81+
dfs(i + 1)
82+
col[j] = dg[i + j] = udg[n - i + j] = 0
83+
g[i][j] = "."
84+
85+
ans = []
86+
g = [["."] * n for _ in range(n)]
87+
col = [0] * n
88+
dg = [0] * (n << 1)
89+
udg = [0] * (n << 1)
7990
dfs(0)
80-
return res
91+
return ans
8192
```
8293

8394
### **Java**
@@ -86,42 +97,42 @@ class Solution:
8697

8798
```java
8899
class Solution {
100+
private List<List<String>> ans = new ArrayList<>();
101+
private int[] col;
102+
private int[] dg;
103+
private int[] udg;
104+
private String[][] g;
105+
private int n;
106+
89107
public List<List<String>> solveNQueens(int n) {
90-
List<List<String>> res = new ArrayList<>();
91-
String[][] g = new String[n][n];
108+
this.n = n;
109+
col = new int[n];
110+
dg = new int[n << 1];
111+
udg = new int[n << 1];
112+
g = new String[n][n];
92113
for (int i = 0; i < n; ++i) {
93-
String[] t = new String[n];
94-
Arrays.fill(t, ".");
95-
g[i] = t;
114+
Arrays.fill(g[i], ".");
96115
}
97-
// 列是否已经有值
98-
boolean[] col = new boolean[n];
99-
// 斜线是否已经有值
100-
boolean[] dg = new boolean[2 * n];
101-
// 反斜线是否已经有值
102-
boolean[] udg = new boolean[2 * n];
103-
// 从第一行开始搜索
104-
dfs(0, n, col, dg, udg, g, res);
105-
return res;
116+
dfs(0);
117+
return ans;
106118
}
107119

108-
private void dfs(int u, int n, boolean[] col, boolean[] dg, boolean[] udg, String[][] g,
109-
List<List<String>> res) {
110-
if (u == n) {
120+
private void dfs(int i) {
121+
if (i == n) {
111122
List<String> t = new ArrayList<>();
112-
for (String[] e : g) {
113-
t.add(String.join("", e));
123+
for (int j = 0; j < n; ++j) {
124+
t.add(String.join("", g[j]));
114125
}
115-
res.add(t);
126+
ans.add(t);
116127
return;
117128
}
118-
for (int i = 0; i < n; ++i) {
119-
if (!col[i] && !dg[u + i] && !udg[n - u + i]) {
120-
g[u][i] = "Q";
121-
col[i] = dg[u + i] = udg[n - u + i] = true;
122-
dfs(u + 1, n, col, dg, udg, g, res);
123-
g[u][i] = ".";
124-
col[i] = dg[u + i] = udg[n - u + i] = false;
129+
for (int j = 0; j < n; ++j) {
130+
if (col[j] + dg[i + j] + udg[n - i + j] == 0) {
131+
g[i][j] = "Q";
132+
col[j] = dg[i + j] = udg[n - i + j] = 1;
133+
dfs(i + 1);
134+
col[j] = dg[i + j] = udg[n - i + j] = 0;
135+
g[i][j] = ".";
125136
}
126137
}
127138
}
@@ -134,70 +145,140 @@ class Solution {
134145
class Solution {
135146
public:
136147
vector<vector<string>> solveNQueens(int n) {
137-
vector<vector<string>> res;
138-
vector<string> g(n, string(n, '.'));
139-
vector<bool> col(n, false);
140-
vector<bool> dg(2 * n, false);
141-
vector<bool> udg(2 * n, false);
142-
dfs(0, n, col, dg, udg, g, res);
143-
return res;
144-
}
145-
146-
void dfs(int u, int n, vector<bool>& col, vector<bool>& dg, vector<bool>& udg, vector<string>& g, vector<vector<string>>& res) {
147-
if (u == n) {
148-
res.push_back(g);
149-
return;
150-
}
151-
for (int i = 0; i < n; ++i) {
152-
if (!col[i] && !dg[u + i] && !udg[n - u + i]) {
153-
g[u][i] = 'Q';
154-
col[i] = dg[u + i] = udg[n - u + i] = true;
155-
dfs(u + 1, n, col, dg, udg, g, res);
156-
g[u][i] = '.';
157-
col[i] = dg[u + i] = udg[n - u + i] = false;
148+
vector<int> col(n);
149+
vector<int> dg(n << 1);
150+
vector<int> udg(n << 1);
151+
vector<vector<string>> ans;
152+
vector<string> t(n, string(n, '.'));
153+
function<void(int)> dfs = [&](int i) -> void {
154+
if (i == n) {
155+
ans.push_back(t);
156+
return;
158157
}
159-
}
158+
for (int j = 0; j < n; ++j) {
159+
if (col[j] + dg[i + j] + udg[n - i + j] == 0) {
160+
t[i][j] = 'Q';
161+
col[j] = dg[i + j] = udg[n - i + j] = 1;
162+
dfs(i + 1);
163+
col[j] = dg[i + j] = udg[n - i + j] = 0;
164+
t[i][j] = '.';
165+
}
166+
}
167+
};
168+
dfs(0);
169+
return ans;
160170
}
161171
};
162172
```
163173
164174
### **Go**
165175
166176
```go
167-
func solveNQueens(n int) [][]string {
168-
res := [][]string{}
169-
g := make([][]string, n)
170-
for i := range g {
171-
g[i] = make([]string, n)
172-
for j := range g[i] {
173-
g[i][j] = "."
177+
func solveNQueens(n int) (ans [][]string) {
178+
col := make([]int, n)
179+
dg := make([]int, n<<1)
180+
udg := make([]int, n<<1)
181+
t := make([][]byte, n)
182+
for i := range t {
183+
t[i] = make([]byte, n)
184+
for j := range t[i] {
185+
t[i][j] = '.'
174186
}
175187
}
176-
col := make([]bool, n)
177-
dg := make([]bool, 2*n)
178-
udg := make([]bool, 2*n)
179-
dfs(0, n, col, dg, udg, g, &res)
180-
return res
181-
}
182-
183-
func dfs(u, n int, col, dg, udg []bool, g [][]string, res *[][]string) {
184-
if u == n {
185-
t := make([]string, n)
186-
for i := 0; i < n; i++ {
187-
t[i] = strings.Join(g[i], "")
188+
var dfs func(int)
189+
dfs = func(i int) {
190+
if i == n {
191+
tmp := make([]string, n)
192+
for i := range tmp {
193+
tmp[i] = string(t[i])
194+
}
195+
ans = append(ans, tmp)
196+
return
188197
}
189-
*res = append(*res, t)
190-
return
191-
}
192-
for i := 0; i < n; i++ {
193-
if !col[i] && !dg[u+i] && !udg[n-u+i] {
194-
g[u][i] = "Q"
195-
col[i], dg[u+i], udg[n-u+i] = true, true, true
196-
dfs(u+1, n, col, dg, udg, g, res)
197-
g[u][i] = "."
198-
col[i], dg[u+i], udg[n-u+i] = false, false, false
198+
for j := 0; j < n; j++ {
199+
if col[j]+dg[i+j]+udg[n-i+j] == 0 {
200+
col[j], dg[i+j], udg[n-i+j] = 1, 1, 1
201+
t[i][j] = 'Q'
202+
dfs(i + 1)
203+
t[i][j] = '.'
204+
col[j], dg[i+j], udg[n-i+j] = 0, 0, 0
205+
}
199206
}
200207
}
208+
dfs(0)
209+
return
210+
}
211+
```
212+
213+
### **TypeScript**
214+
215+
```ts
216+
function solveNQueens(n: number): string[][] {
217+
const col: number[] = new Array(n).fill(0);
218+
const dg: number[] = new Array(n << 1).fill(0);
219+
const udg: number[] = new Array(n << 1).fill(0);
220+
const ans: string[][] = [];
221+
const t: string[][] = Array(n)
222+
.fill(0)
223+
.map(() => Array(n).fill('.'));
224+
const dfs = (i: number) => {
225+
if (i === n) {
226+
ans.push(t.map(x => x.join('')));
227+
return;
228+
}
229+
for (let j = 0; j < n; ++j) {
230+
if (col[j] + dg[i + j] + udg[n - i + j] === 0) {
231+
t[i][j] = 'Q';
232+
col[j] = dg[i + j] = udg[n - i + j] = 1;
233+
dfs(i + 1);
234+
col[j] = dg[i + j] = udg[n - i + j] = 0;
235+
t[i][j] = '.';
236+
}
237+
}
238+
};
239+
dfs(0);
240+
return ans;
241+
}
242+
```
243+
244+
### **C#**
245+
246+
```cs
247+
public class Solution {
248+
private int n;
249+
private int[] col;
250+
private int[] dg;
251+
private int[] udg;
252+
private IList<IList<string>> ans = new List<IList<string>>();
253+
private IList<string> t = new List<string>();
254+
255+
public IList<IList<string>> SolveNQueens(int n) {
256+
this.n = n;
257+
col = new int[n];
258+
dg = new int[n << 1];
259+
udg = new int[n << 1];
260+
dfs(0);
261+
return ans;
262+
}
263+
264+
private void dfs(int i) {
265+
if (i == n) {
266+
ans.Add(new List<string>(t));
267+
return;
268+
}
269+
for (int j = 0; j < n; ++j) {
270+
if (col[j] + dg[i + j] + udg[n - i + j] == 0) {
271+
char[] row = new char[n];
272+
Array.Fill(row, '.');
273+
row[j] = 'Q';
274+
t.Add(new string(row));
275+
col[j] = dg[i + j] = udg[n - i + j] = 1;
276+
dfs(i + 1);
277+
col[j] = dg[i + j] = udg[n - i + j] = 0;
278+
t.RemoveAt(t.Count - 1);
279+
}
280+
}
281+
}
201282
}
202283
```
203284

0 commit comments

Comments
 (0)