前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >N 皇后问题_用回溯法解N皇后问题

N 皇后问题_用回溯法解N皇后问题

作者头像
全栈程序员站长
发布于 2022-11-19 04:16:53
发布于 2022-11-19 04:16:53
42800
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

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

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
  • 采用回溯法解决如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
private List<List<String>> res = new ArrayList<>();
private boolean[] col;    // false 代表竖方向没有皇后
private boolean[] dia1;   // false 代表 左下 到 上右 对角线没有皇后, 这条对角线所有元素横纵坐标和相同
private boolean[] dia2;   // false 代表 左上 到 下右 对角线没有皇后, 这条对角线所有元素横纵坐标差相同
public List<List<String>> solveNQueens(int n) {
if(n < 1)
return res;
col = new boolean[n];
dia1 = new boolean[2*n-1];  // 对角线条数
dia2 = new boolean[2*n-1];
LinkedList<Integer> row = new LinkedList<>();
putQueue(n, 0, row);
return res;
}
// 尝试在一个n皇后问题中,摆放第index行的皇后位置
public void putQueue(int n, int index, LinkedList<Integer> row){
if(index == n){
res.add(generateBoard(n ,row));
return ;
}
for(int i=0; i<n; i++)
if( !col[i] && !dia1[index+i] && !dia2[index-i+n-1]){   // index-i+n-1 :将横纵坐标差值转换为数组坐标
row.addLast(i);
col[i] = true;
dia1[i+index] = true;
dia2[index-i+n-1] = true;
putQueue(n, index+1, row);
row.removeLast();
col[i] = false;
dia1[i + index] = false;
dia2[index-i+n-1] = false;
}
return ;
}
private List<String> generateBoard(int n, LinkedList<Integer> row){
assert(row.size() == n);
ArrayList<String> board = new ArrayList<>();
for(int i = 0 ; i < n ; i++){
char[] charArray = new char[n];
Arrays.fill(charArray, '.');
charArray[row.get(i)] = 'Q';
board.add(new String(charArray));
}
return board;
}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187539.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月30日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
n-皇后问题
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
GeekLiHua
2025/01/21
690
n-皇后问题
leetcode: 51. N-Queens
Problem # The n-queens puzzle is the problem of placing n queens on # an nxn chess board such that n
JNingWei
2018/09/27
4750
leetcode: 51. N-Queens
LeetCode51. N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
Yuyy
2022/06/28
1640
LeetCode51. N皇后
算法刷题-四数之和、缺失的第一个正数、N 皇后
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 **注意:**答案中不可以包含重复的四元组。
共饮一杯无
2023/02/10
2850
算法刷题-四数之和、缺失的第一个正数、N 皇后
​LeetCode刷题实战51:N 皇后
https://leetcode-cn.com/problems/n-queens/
程序员小猿
2021/01/20
3410
LeetCode 51. N-Queens
N皇后问题是一个非常经典的 回溯+剪枝问题,值得注意的是,在遍历的过程中,针对同列的元素可以用col[i]来表示第i 列是否有元素,但是对于某个节点的两个对角线而言,遍历固然可行,但是这里有一个比较方便的方法:
我有一只萌妹子
2022/06/23
1840
【一天一大 lee】N皇后 II (难度:困难) - Day20201017
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
前端小书童
2020/11/03
3000
【一天一大 lee】N皇后 II (难度:困难) - Day20201017
前端「N皇后」递归回溯经典问题图解
在我的上一篇文章《前端电商 sku 的全排列算法很难吗?学会这个套路,彻底掌握排列组合。》中详细的讲解了排列组合的递归回溯解法,相信看过的小伙伴们对这个套路已经有了一定程度的掌握(没看过的同学快回头学习~)。
ssh_晨曦时梦见兮
2020/10/15
1.1K0
【回溯+剪枝】优美的排列 && N皇后(含剪枝优化)
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :
利刃大大
2025/02/04
700
【回溯+剪枝】优美的排列 && N皇后(含剪枝优化)
LeetCode-51-N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
benym
2022/07/14
2380
51. N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
张伦聪zhangluncong
2022/10/26
3270
回溯法+约束编程-LeetCode51(N皇后问题与解数独问题对比)
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
算法工程师之路
2019/10/13
7970
DFS&BFS - 51. N-Queens
The n-queens puzzle is the problem of placing n queens on an n_×_n chessboard such that no two queens attack each other.
ppxai
2020/09/23
3500
DFS&BFS - 51. N-Queens
​LeetCode刷题实战52:N皇后 II
https://leetcode-cn.com/problems/n-queens-ii/
程序员小猿
2021/01/20
4040
52. N皇后 II
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
张伦聪zhangluncong
2022/10/26
2170
LintCode N皇后问题题目分析代码
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
desperate633
2018/08/22
2660
LeetCode 刷题记录(三)
这道题是「回溯法」的经典应用。基本的思路是:从第一行开始,每行按列循环放置皇后,如果找到一个符合规则的位置,则到下一行,以此类推,如果可以一直进行到最后一行,则得到一个正确的解法,记录下来;如果到某一行发现没有符合要求的位置,就回到上一行,对该行还未循环的位置继续按列循环。重复上述过程,直到所有格子均被遍历。可以看出,这种解法实际上是一种「深度优先搜索」。
口仆
2020/08/16
4280
DFS&BFS - 52. N-Queens II
The n-queens puzzle is the problem of placing n queens on an n_×_n chessboard such that no two queens attack each other.
ppxai
2020/09/23
4520
DFS&BFS - 52. N-Queens II
leetcode刷题(52)——51. N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
老马的编程之旅
2022/06/22
2070
leetcode刷题(52)——51. N皇后
LC51— N 皇后
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
Java架构师必看
2021/05/14
3660
LC51— N 皇后
相关推荐
n-皇后问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验