技术干货(四)「LeetCode」51 - 60题详解
51. N 皇后n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上 , 并且使皇后彼此之间不能相互攻击 。
文章插图
上图为 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 的棋盘上 , 并且使皇后彼此之间不能相互攻击 。文章插图
上图为 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;}}
- TikTok推出首个利用iPhone 12 Pro LiDAR技术的AR特效
- Looking Glass推出由全息成像技术打造的3D照片软件
- 最壕“年终奖”出炉!雷军下血本:一次颁发两个百万美金技术大奖
- 小米授予技术团队百万美元大奖 雷军:将继续加大技术投入
- 「央广网评」扫码点餐 技术进步不能脱离人性化服务
- 华为为河北“火眼”实验室(气膜版)提供网络技术保障
- 与荷兰光刻机完成联机!国产芯片设备传来喜讯:技术问题已经解决
- 国产芯再传好消息,关键技术问题已经解决,与荷兰光刻机联机成功
- 搬起石头砸自己脚!日本这项技术封锁中国,如今舔着脸求我们教他
- 企业|技术快速迭代倒逼知识产权“贴身”服务,上海首家AI商标品牌指导站入驻徐汇西岸