Skip to content

Commit 10b33ea

Browse files
committed
Java version of Nqueens
1 parent 372b92b commit 10b33ea

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

算法思维系列/回溯算法详解修订版.md

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,4 +309,67 @@ def backtrack(...):
309309
<img src="../pictures/qrcode.jpg" width=200 >
310310
</p>
311311

312-
======其他语言代码======
312+
======其他语言代码======
313+
314+
[kepler-zc](https://github.com/kepler-zc) 提供 51.N皇后 Java 解法代码:
315+
```java
316+
class solution {
317+
private List<List<String>> res = new ArrayList<>();
318+
319+
// 输入棋盘边长 n,返回所有合法的放置
320+
public List<List<String>> solveNQueens(int n){
321+
// '.'表示空,'Q'表示皇后,初始化空棋盘
322+
char[][] chess = new char[n][n];
323+
for (int i = 0; i < n; i++) {
324+
Arrays.fill(chess[i], '.');
325+
}
326+
// 已经不能放置皇后的列(被占用)
327+
boolean[] usedCol = new boolean[n];
328+
// 已经不能放置皇后的正斜线 , 按右上角到左下角排列 , 共2n-1条
329+
boolean[] usedSlash = new boolean[2*n-1];
330+
// 已经不能放置皇后的反斜线 , 按左上角到右下角排列 , 共2n-1条
331+
boolean[] usedBackSlash = new boolean[2*n-1];
332+
backtrack(chess, 0, usedCol, usedSlash, usedBackSlash);
333+
return res;
334+
}
335+
336+
// 路径:chess 中小于 row 的那些行都已经成功放置了皇后
337+
// 选择列表:第 row 行的所有列都是放置皇后的选择
338+
// 结束条件:row 超过 棋盘最后一行
339+
private void backtrack(char[][] chess, int row, boolean[] usedCol, boolean[] usedSlash, boolean[] usedBackSlash) {
340+
// 触发结束条件
341+
if (row == chess.length){
342+
res.add(construct(chess));
343+
return;
344+
}
345+
for (int col = 0; col < chess.length; col++) {
346+
// 对合法选择进行回溯操作
347+
// 分别检查列,左上方, 右上方是否存在皇后冲突,都不冲突集为合法选择。
348+
if (!usedCol[col] && !usedSlash[row-col+usedCol.length-1] && !usedBackSlash[col+row]){
349+
// 做选择
350+
chess[row][col] = 'Q';
351+
usedCol[col] = true;
352+
// 对坐标为[i,j]的点对应的正斜线和反斜线的索引分别为:row-col+n-1; col+row
353+
usedSlash[row-col+chess.length-1] = true;
354+
usedBackSlash[col+row] = true;
355+
// 进入下一行
356+
backtrack(chess, row+1, usedCol,usedSlash, usedBackSlash);
357+
// 撤销选择
358+
chess[row][col] = '.';
359+
usedCol[col] = false;
360+
usedSlash[row-col+chess.length-1] = false;
361+
usedBackSlash[col+row] = false;
362+
}
363+
}
364+
}
365+
366+
private List<String> construct(char[][] chess) {
367+
// 数组转List
368+
List<String> path = new ArrayList<>();
369+
for (char[] chars : chess) {
370+
path.add(new String(chars));
371+
}
372+
return path;
373+
}
374+
}
375+
```

0 commit comments

Comments
 (0)