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