51. N 皇后

news/2024/11/9 9:23:47/

51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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

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

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

示例1:

在这里插入图片描述

输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[[“Q”]]

提示:

  • 1 <= n <= 9

思路:(回溯)

在 n*n 的矩阵中摆放 n 个皇后,并且每个皇后不能在同一行,同一列,同一对角线上,求所有的 n 皇后的解。
法一 :暴力求解;
法二 : 一行一行地摆放,在确定一行中的那个皇后应该摆在哪一列时,需要用三个标记数组来确定某一列是否合法,这三个标记数组分别为:列标记数组、45 度对角线标记数组和 135 度对角线标记数组。

  • 45 度对角线标记数组的长度为 2 * n - 1,通过下图可以明确 (r, c) 的位置所在的数组下标为 r + c:
    在这里插入图片描述
  • 135 度对角线标记数组的长度也是 2 * n - 1,(r, c) 的位置所在的数组下标为 n - 1 - (r - c)。
  • 在这里插入图片描述

代码:(Java)

法一:
import java.util.ArrayList;
import java.util.List;public class Nqueen {public static void main(String[] args) {// TODO Auto-generated method stubint n = 4;System.out.println(solveNQueens(n));}private static int N;public static List<List<String>> solveNQueens(int n) {List<List<String>> combinations = new ArrayList<>();List<String> combination = new ArrayList<>();char [][] Q = new char[n][n];N = n;backtracking(combinations, combination, Q, 0);return combinations;}private static void backtracking(List<List<String>> combinations, List<String> combination, char[][] Q, int r) {// TODO Auto-generated method stubif(r == N) {combinations.add(new ArrayList<>(combination));return;}for(int i = 0; i < N; i++) {if(!tookup(r, i, Q)) {continue;}Q[r][i] = 'Q';StringBuffer s = new StringBuffer();for(int j = 0; j < N; j++) {if(j != i) {s.append(".");}else {s.append("Q");}}combination.add(s.toString());backtracking(combinations, combination, Q, r + 1);Q[r][i] = ' ';combination.remove(combination.size() - 1);}}private static boolean tookup(int r, int c, char[][] Q) {// TODO Auto-generated method stubfor(int i = 0; i < N; i++) {if(Q[r][i] == 'Q' || Q[i][c] == 'Q') {return false;}if(r-i >= 0 && c-i >= 0 && Q[r-i][c-i] == 'Q')return false;if(r+i < N && c+i < N && Q[r+i][c+i] == 'Q')return false;if(r+i < N && c-i >= 0 && Q[r+i][c-i] == 'Q')return false;if(r-i >= 0 && c+i < N && Q[r-i][c+i] == 'Q')return false;}return true;}
}
法二:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Nqueen {public static void main(String[] args) {// TODO Auto-generated method stubint n = 4;System.out.println(solveNQueens(n));}private static List<List<String>> solutions;private static char[][] nQueens;private static boolean[] colUsed;private static boolean[] diagonals45Used;private static boolean[] diagonals135Used;private static int N;public static List<List<String>> solveNQueens(int n) {solutions = new ArrayList<>();nQueens = new char[n][n];for (int i = 0; i < n; i++) {Arrays.fill(nQueens[i], '.');}colUsed = new boolean[n];diagonals45Used = new boolean[2 * n - 1];diagonals135Used = new boolean[2 * n - 1];N = n;backtracking(0);return solutions;}private static void backtracking(int row) {if (row == N) {List<String> list = new ArrayList<>();for (char[] chars : nQueens) {list.add(new String(chars));}solutions.add(list);return;}for (int col = 0; col < N; col++) {int diagonals45Idx = row + col;int diagonals135Idx = N - 1 - (row - col);if (colUsed[col] || diagonals45Used[diagonals45Idx] || diagonals135Used[diagonals135Idx]) {continue;}nQueens[row][col] = 'Q';colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = true;backtracking(row + 1);colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = false;nQueens[row][col] = '.';}}
}

运行结果:

在这里插入图片描述

注:仅供学习参考!

题目来源:力扣.


http://www.ppmy.cn/news/814007.html

相关文章

深搜——八皇后

原题链接 八皇后 题目 题目的大体意思就是给你一个n*n的棋盘&#xff0c;在棋盘上放置n个皇后&#xff0c;使得不同行&#xff0c;不同列&#xff0c;不同对角线&#xff0c;最后打印前 3 个解。最后一行是解的总个数。 分析 这个题就是一个典型的深搜&#xff0c;回溯。从…

半生铁总宪,三千美娇娘(修改中...)。

三年清知府&#xff0c;十万雪花银。 半生铁总宪&#xff0c;三千美娇娘。 七品小县令&#xff0c;一朝城中坐。 金银不知数&#xff0c;莺燕满偏厢。 转载于:https://www.cnblogs.com/chuyf/archive/2006/04/07/369673.html

“触摸文明印记 感悟非遗魅力” 活字印刷体验活动

为传承中华传统文化&#xff0c;弘扬非物质文化遗产&#xff0c;近日&#xff0c;运河街道天衢西路社区携手新领航社工开展“触摸文明印记 感悟非遗魅力”活字印刷体验活动&#xff0c;带领青少年们穿越时空&#xff0c;一起用双手触摸跨越千年的记忆&#xff0c;近距离接触古老…

出招分析_饿狼传说9狼之印记

分析 28fc4 出招进入 a4 Fighter1 100400 0 0002 8fc4c2 8000 000016 0000f6 0000D4 002A C85C7e 047f clrbbbc 01bd 0120 x坐标2C x坐标73 人物大小6a 002a 318a6062 c162 c067 405e 0405 15354 (2170E6)0026ff9854 (21778E)0026ffA876 0021 33467a 2170ec 2177907a 12170ec…

拾光·印记婚纱摄影管理系统的设计与实现mysql

原文链接&#xff1a;请点这里 项目描述 本系统实现了拾光印记婚纱摄影管理系统的设计与实现mysql的基本功能&#xff0c;主要功能如下。 技术支持 eclipse、SSH、Jdk1.8、jsp、 mysql 系统提供的具体功能如下&#xff1a; 登录注册样片欣赏每日照客群聊留言板人员管理评…

印记中文

https://docschina.org/ 转载于:https://www.cnblogs.com/jinhh/p/8616907.html

《设计模式》责任链模式

《设计模式》责任链模式 定义&#xff1a; 责任链模式将链中每一个节点都看成一个对象&#xff0c;并且将这些节点对象连成一条链&#xff0c;请求会沿着这条链进行传递&#xff0c;直到有对象处理它为止&#xff0c;这使得多个对象都有机会接收请求&#xff0c;避免了请求发送…

皇后宣娇赋采系列:淡化岁月痕迹,赋予肌肤年轻风采

我们终其一生&#xff0c;都在追寻一个答案&#xff0c;如何让自己老得慢一点、再慢一点。 事实上&#xff0c;随着年龄的增长&#xff0c;我们人体的每个器官都在走向衰老&#xff0c;而肌肤的“岁月问题”是更先一步被我们所察觉。有的人在某一刻、某一瞬间发现皮肤状态下滑…