47
47
48
48
<!-- 这里可写通用的实现逻辑 -->
49
49
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$ 是题目给定的整数。
51
63
52
64
<!-- tabs:start -->
53
65
58
70
``` python
59
71
class Solution :
60
72
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])
70
76
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 )
79
90
dfs(0 )
80
- return res
91
+ return ans
81
92
```
82
93
83
94
### ** Java**
@@ -86,42 +97,42 @@ class Solution:
86
97
87
98
``` java
88
99
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
+
89
107
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];
92
113
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], " ." );
96
115
}
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;
106
118
}
107
119
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) {
111
122
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] ));
114
125
}
115
- res . add(t);
126
+ ans . add(t);
116
127
return ;
117
128
}
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 ] = " . " ;
125
136
}
126
137
}
127
138
}
@@ -134,70 +145,140 @@ class Solution {
134
145
class Solution {
135
146
public:
136
147
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;
158
157
}
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;
160
170
}
161
171
};
162
172
```
163
173
164
174
### **Go**
165
175
166
176
```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] = '.'
174
186
}
175
187
}
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
188
197
}
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
+ }
199
206
}
200
207
}
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
+ }
201
282
}
202
283
```
203
284
0 commit comments