LeetCode算法题解(回溯、难点)|LeetCode51. N 皇后

LeetCode51. N 皇后

题目链接: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
算法分析:

首先我们创建一张字符串数组ArrayList<StringBuffer> path2来描述整张棋盘(因为后面需要对棋盘上地每个格子进行操作也即字符串中的元素,所以我们用StringBuffer来当作数组元素),然后用"."来填充棋盘上地每个格子。

然后通过递归一层一层的去遍历棋盘(path),然后放置皇后"Q";

递归结束条件:当放置到最后一层时,说明已经有一种放置方法了,将这种解法放置到结果及当中。

代码如下:

  public void backTravel(int startx) {//递归时,向下一层一层地放置皇后if(startx == len) {//如果最后一层也放了皇后,说明有一种解法了。//将path2先转化成String再,将其放到结果集....return;}
}

然后在每一层当中,从左到右一次去遍历,并判断该位置是否可以放皇后,如果可以放置,将当前位置的字符修改为"Q",然后递归下一层,在回溯:

       for(int j = 0; j < len; j++) {//每一层,从左到右遍历,并判断该位置是否可以放置皇后if(canPut(startx, j) == true) {... //如果可以放置,将当前位置地字符'.'修改成'Q';...//递归,去放置下一层...//回溯}}

 判断当前是否可以放置皇后的方法:

    public boolean canPut(int x, int y) {//用来判断坐标位置是否可以放上皇后for(int j = y; j < len; j++) {//向左搜索是否有皇后,因为还没对右边操作过所以不用遍历....return false;}for(int i = x; i >= 0; i--) {//向上搜索是否幽皇后,因为还没对下边进行操作所以不用遍历.....return false;}for(int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {//向左上对角线遍历是否有皇后.....return false;}for(int i = x - 1, j = y + 1; i >=0 && j < len; i--, j++) {//向右上对角线遍历是否有皇后.....return false;}//如果左边,右边,左上对角线,右上对角线都没有皇后说明可以在当前位置放置皇后,返回truereturn true;}

完整的代码如下:

class Solution {List<List<String>>result = new ArrayList<>();//用来收集所有的解法ArrayList<StringBuffer>path = new ArrayList<>();//用来遍历每种解法,因为要对每个字符串中的字符进行修改操作,所以用StringBufferint len;//矩形边长public boolean canPut(int x, int y) {//迎来判断坐标位置是否可以放上皇后for(int j = y; j < len; j++) {//向左搜索是否有皇后,因为还没对右边操作过所以不用遍历if(path.get(x).charAt(j) == 'Q')return false;}for(int i = x; i >= 0; i--) {//向上搜索是否幽皇后,因为还没对下边进行操作所以不用遍历if(path.get(i).charAt(y) == 'Q')return false;}for(int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {//向左上对角线遍历是否有皇后if(path.get(i).charAt(j) == 'Q')return false;}for(int i = x - 1, j = y + 1; i >=0 && j < len; i--, j++) {//向右上对角线遍历是否有皇后if(path.get(i).charAt(j) == 'Q')return false;}//如果左边,右边,左上对角线,右上对角线都没有皇后说明可以在当前位置放置皇后,返回truereturn true;}public void backTravel(int startx) {//递归时,向下一层一层地放置皇后if(startx == len) {//如果最后一层也放了皇后,说明有一种解法了。//将path2先转化成String再,将其放到结果集ArrayList<String>path2 = new ArrayList<>();for(StringBuffer sb : path) {path2.add(sb.toString());}result.add(path2);return;}for(int j = 0; j < len; j++) {//每一层,从左到右遍历,并判断该位置是否可以放置皇后if(canPut(startx, j) == true) {//如果可以放置,将当前位置地字符'.'修改成'Q';path.get(startx).setCharAt(j, 'Q');backTravel(startx + 1);//递归,去放置下一层path.get(startx).setCharAt(j, '.');//回溯}}}public List<List<String>> solveNQueens(int n) {len = n;for(int i = 0; i < n; i++) {//将path2填充上'.';StringBuffer sb = new StringBuffer();for(int j = 0; j < n; j++) sb.append(".");path.add(sb);}backTravel(0);return result;}
}

总结

这道题的难点是如何用字符来描述棋盘,并对每个格子进行是否可以放置皇后的判断和操作。

然后是放置皇后的顺序,我们用递归从上往下一层一层去遍历,每一层当中要从左到右一个个位置判断并放置皇后(注意回溯,每一层只能放一个)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/186508.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博士每天一篇文献-算法】Learning without forgetting

阅读时间&#xff1a;2023-10-29 1 介绍 年份&#xff1a;2016 作者&#xff1a;李志忠; 德里克霍伊姆&#xff0c;伊利诺伊大学 期刊&#xff1a;IEEE transactions on pattern analysis and machine intelligence 引用量&#xff1a;3353 提出一种名为"无忘记学习&quo…

【广州华锐互动】VR影视制片虚拟仿真教学系统

随着虚拟现实(VR)技术的不断发展&#xff0c;VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义&#xff0c;并通过案例分析来更好地展示其应用前景。 在影视制片教学中&#xff0c;VR可以提供一种沉浸式的制作体验。其中&am…

[unity]多脚本情况下update函数的执行顺序

序 有的时候&#xff0c;执行某些脚本时会有先后顺序的要求。unity是按什么顺序来执行脚本的&#xff1f;如何设置&#xff1f; 默认的执行顺序 官方文档里面有个很长的图&#xff1a; Unity - Manual: Order of execution for event functions (unity3d.com) 根据文档&…

虚幻C++基础 day4

虚幻中的UI 虚幻中的比较常用的UI&#xff1a;Widget Blueprint又称UMG虚幻中的两种布局&#xff1a; 网格布局锚布局 创建Widget Blueprint 网格布局 有点类似Qt中的网格布局&#xff0c;将UI面板进行行列切分Horizontal Box&#xff1a;水平分布Vertical Box&#xff1a;…

说说对React中类组件和函数组件的理解?有什么区别?

一、类组件 类组件&#xff0c;顾名思义&#xff0c;也就是通过使用ES6类的编写形式去编写组件&#xff0c;该类必须继承React.Component 如果想要访问父组件传递过来的参数&#xff0c;可通过this.props的方式去访问 在组件中必须实现render方法&#xff0c;在return中返回…

网站接口测试记录

1.被测试服务器端口输入htop指令进行cpu监控 2.测试机器安装宝塔-》我的工具-》进行网站测试 访问地址&#xff1a;https://www.bt.cn/bbs/thread-52772-1-1.html

基于JavaWeb+SpringBoot+微信小程序的酒店商品配送平台系统的设计和实现

基于JavaWebSpringBoot微信小程序的酒店商品配送平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 本章内容概括了基于微信小程序的酒店商品配送平台的可行性分析、系统功…

网络编程套接字(3)——协议定制 | 序列化与反序列化

文章目录 一.认识“协议”1.协议的概念2.结构化数据的传输3.序列化和反序列化 二. 网络版计算器1.服务端2.协议定制(1) 网络发送和读取的正确理解(2) 协议定制的问题 3.客户端4.代码 三.Json实现序列化反序列化1.简单介绍2.使用 一.认识“协议” 1.协议的概念 协议&#xff0c…

uniapp小程序才到第五层就报错navigateto:fail webview count limit exceed

错误截图 原因 小程序官方描述是说可以跳转10层&#xff0c;但是使用uniapp开发的程序在小程序中才运行到第五层就报错了&#xff0c;原因是因为没有设置appId。如果设置了就正常了。

工业自动化与5G技术的融合:开启工业4.0时代的新篇章

工业自动化与5G技术的融合&#xff1a;开启工业4.0时代的新篇章 随着全球数字化进程的加速推进&#xff0c;工业自动化作为现代制造业的核心驱动力&#xff0c;正经历着前所未有的变革。而在这一变革中&#xff0c;5G技术的崛起为工业自动化带来了全新的可能性和机遇。本文将探…

计算机网络第4章-IPv6和寻址

IP地址的分配 为了获取一块IP地址用于一个组织的子网内&#xff0c;于是我们向ISP联系&#xff0c;ISP则会从已分给我们的更大 地址块中提供一些地址。 例如&#xff0c;ISP也许已经分配了地址块200.23.16.0/20。 该ISP可以依次将该地址块分成8个长度相等的连续地址块&…

Linux开发工具之编辑器vim

文章目录 1.vim是啥?1.1问问度娘1.2自己总结 2.vim的初步了解2.1进入和退出2.2vim的模式1.介绍2.使用 3.vim的配置3.1自己配置3.2下载插件3.3安装大佬配置好的文件 4.程序的翻译 1.vim是啥? 1.1问问度娘 1.2自己总结 vi/vim都是多模式编辑器&#xff0c;vim是vi的升级版本&a…

VR全景技术,为养老院宣传推广带来全新变革

现如今&#xff0c;人口老龄化的现象加剧&#xff0c;养老服务行业也如雨后春笋般不断冒头&#xff0c;但是市面上各式的养老院被包装的五花八门&#xff0c;用户实际参访后却差强人意&#xff0c;如何更好的给父母挑选更为舒心的养老环境呢&#xff1f;可以利用720度VR全景技术…

泄露35TB数据,医疗巨头Henry Schein遭受黑猫勒索组织攻击

近日&#xff0c;据Bleeping Computer 网站消息&#xff0c;BlackCat&#xff08;黑猫&#xff09;勒索软件团伙将医疗保健巨头Henry Schein 添加到了其暗网泄露网站&#xff0c;并声称其破坏了该公司的网络&#xff0c;窃取了35 TB的敏感文件&#xff0c;这些文件包括了Henry …

边缘计算如何改变数据存储?

边缘计算在整个价值链中提供多种优势——从降低成本到提高效率再到安全数据传输。该技术允许在源头收集和分析相关数据&#xff0c;这有助于减少延迟和带宽成本&#xff0c;同时显著提高计算过程的冗余系数和效率。 通过降低数据传输成本和损失&#xff0c;边缘计算帮助企业实现…

ssm+vue的疫情防控管理系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的疫情防控管理系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网…

Yolov5 + 界面PyQt5 +.exe文件部署运行

介绍 Yolov5是一种基于深度学习的目标检测算法&#xff0c;PyQt5是一个Python编写的GUI框架&#xff0c;用于创建交互式界面。在部署和运行Yolov5模型时&#xff0c;结合PyQt5可以方便地创建一个用户友好的界面&#xff0c;并将代码打包为.exe文件以供其他人使用。 下面是一个…

docker部署es+kibana

es 暴露的端口特别多 &#xff0c;十分耗内存&#xff0c;数据一般要放置到安全目录&#xff0c;挂载 官网推荐的命令&#xff1a;docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch…

汽车工业生产线数字孪生可视化管理平台,赋予工厂车间数字化智慧化管理

在工业4.0 的时代背景下&#xff0c;随着企业数字化进程的推进&#xff0c;数字孪生可视化技术逐渐在汽车行业得到广泛应用&#xff0c;数字孪生智慧工厂的建设也成为了汽车行业数字化转型的趋势之一。汽车制造业属于典型的离散制造行业&#xff0c;汽车生产包含冲压、焊接、涂…

Bytebase 2.11.0 - 支持 OceanBase Oracle 模式

&#x1f680; 新功能 支持 OceanBase Oracle 模式。支持设置 MySQL 在线变更参数。新增项目数据库查看者的角色。 &#x1f384; 改进 支持在项目中直接选择所有用户并为之添加角色。 调整了项目页面的布局。在 SQL 编辑器中通过悬浮面板展示表和列的详情。 &#x1faa6; …