51. N 皇后

描述

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

链接

51. N 皇后 - 力扣(LeetCode) (leetcode-cn.com)

 

解法

 1 class Solution {
 2     List<List<String>> res = new ArrayList<>();
 3 
 4     public List<List<String>> solveNQueens(int n) {
 5         char[][]  chessBoard = new char[n][n];
 6         for (char[] c : chessBoard) {
 7             Arrays.fill(c, '.');
 8         }
 9         backTracking(n, 0,chessBoard);
10         return res;
11     }
12 
13     //从行开始进行
14     public void backTracking(int n, int row,char[][] chessBoard) {
15         if(row == n) {
16             res.add(Array2List(chessBoard)); // 将数组转化为List
17             return;
18         }
19         // 从列开始遍历
20         for (int col = 0; col < n; col++) {
21             if(isValid(row, col, n, chessBoard)) {
22                 chessBoard[row][col] = 'Q';
23                 backTracking(n, row + 1, chessBoard);
24                 chessBoard[row][col] = '.';
25             }
26         }
27     }
28 
29     public List Array2List(char[][] chessboard) {
30         List<String> list = new ArrayList<>();
31 
32         for (char[] c : chessboard) {
33             list.add(String.copyValueOf(c));
34         }
35         return list;
36     }
37 
38     private boolean isValid(int row, int col, int n,char[][] chessBoard) {
39         // 不检查行的原因在于 每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重
40         // 即 回溯中的递归,进行了 row+1
41         // 检查列
42         for (int i = 0; i < row; i++) {
43             if(chessBoard[i][col] == 'Q') {
44                 return false;
45             }
46         }
47 
48         // 检查左上
49         for (int i = row - 1, j = col -1; i >= 0 && j >= 0; i--, j--) {
50             if(chessBoard[i][j] == 'Q') {
51                 return false;
52             }
53         }
54 
55         // 检查右上
56         for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
57             if (chessBoard[i][j] == 'Q') {
58                 return false;
59             }
60         }
61         return true;
62     }
63 }

 

参考

carl

posted @ 2021-12-21 11:40  DidUStudy  阅读(24)  评论(0编辑  收藏  举报