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