技术干货(四)「LeetCode」51 - 60题详解

51. N 皇后n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上 , 并且使皇后彼此之间不能相互攻击 。
技术干货(四)「LeetCode」51 - 60题详解文章插图
上图为 8 皇后问题的一种解法 。
给定一个整数 n , 返回所有不同的 n 皇后问题的解决方案 。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案 , 该方案中 'Q' 和 '.' 分别代表了皇后和空位 。
示例:
输入:4输出:[ [".Q..",// 解法 1"...Q","Q...","..Q."], ["..Q.",// 解法 2"Q...","...Q",".Q.."]]解释: 4 皇后问题存在两个不同的解法 。 提示:

  • 皇后彼此不能相互攻击 , 也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上 。
class Solution {List res = new ArrayList<>();public List solveNQueens(int n) {char[][] board = new char[n][n];// 初始化boardfor(char[] chs : board) Arrays.fill(chs, '.');// 从第一行开始dfs(board, 0);return res;}void dfs(char[][] board, int row){if(row == board.length){List result = new LinkedList<>();for(char[] r: board) result.add(String.valueOf(r));res.add(result);return;}int n = board[0].length;// 尝试遍历一行的位置放上Qfor(int col = 0; col < n; col ++){// 排除无效情况if(!valid(board, row , col)) continue;// 尝试放皇后board[row][col] = 'Q';dfs(board, row + 1);// 重置board[row][col] = '.';}}boolean valid(char[][] board, int row , int col){int rows = board.length;// 判断列for (char[] chars : board) if (chars[col] == 'Q') return false;// 判断右对角for (int i = row - 1, j = col + 1; i >= 0i--, j++) {if (board[i][j] == 'Q') return false;}// 判断左对角for (int i = row - 1, j = col - 1; i >= 0i--, j--) {if (board[i][j] == 'Q') return false;}return true;}}52. N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上 , 并且使皇后彼此之间不能相互攻击 。
技术干货(四)「LeetCode」51 - 60题详解文章插图
上图为 8 皇后问题的一种解法 。
给定一个整数 n , 返回 n 皇后不同的解决方案的数量 。
示例:
输入: 4输出: 2解释: 4 皇后问题存在如下两个不同的解法 。 [ [".Q..",// 解法 1"...Q","Q...","..Q."], ["..Q.",// 解法 2"Q...","...Q",".Q.."]]class Solution {int res = 0;public int totalNQueens(int n) {char[][] board = new char[n][n];// 初始化boardfor(char[] chs : board) Arrays.fill(chs, '.');// 从第一行开始dfs(board, 0);return res;}void dfs(char[][] board, int row){if(row == board.length){res ++;return;}int n = board[0].length;// 尝试遍历一行的位置放上Qfor(int col = 0; col < n; col ++){// 排除无效情况if(!valid(board, row , col)) continue;// 尝试放皇后board[row][col] = 'Q';dfs(board, row + 1);// 重置board[row][col] = '.';}}boolean valid(char[][] board, int row , int col){int rows = board.length;// 判断列for (char[] chars : board) if (chars[col] == 'Q') return false;// 判断右对角for (int i = row - 1, j = col + 1; i >= 0i--, j++) {if (board[i][j] == 'Q') return false;}// 判断左对角for (int i = row - 1, j = col - 1; i >= 0i--, j--) {if (board[i][j] == 'Q') return false;}return true;}}