代码随想录:回溯20-21

51.N皇后

题目

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

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

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

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

示例 1:

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

代码

class Solution {
    List<List<String>> res = new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {
        //棋盘初始化全为.
        char[][] path = new char[n][n];
        for(char[] c : path){
            Arrays.fill(c,'.');
        }
        //从第一行开始回溯
        backTracking(n,0,path);
        return res;
    }
    public void backTracking(int n,int row,char[][] path){
        //row到了最后一行,把path转为List加入res
        if(row == n){
            List<String> list = new ArrayList<>();
            for(char[] c : path){ //获取棋盘的每一行char[]
                String s = String.copyValueOf(c); //把char[]转为String
                list.add(s);
            }
            res.add(list); //把path对应的List加入结果集
            return;
        }
        //n个分支代表不同的列取值
        for(int col=0; col < n; col++){
            //如果此时path[row][col]的棋盘合法
            if(judge(row,col,path,n) == true){
                path[row][col] = 'Q';  //确定row行的Q
                backTracking(n,row+1,path);  //回溯row+1行
                path[row][col] = '.'; //回溯row行的Q,为下一个列做准备
            }
        }
    }
    public boolean judge(int row,int col,char[][] path,int n){
        //因为回溯过程中row一值变大,所以不用考虑同一行
        //同一列
        for(int i=row-1; i >=0; i--){
            if(path[i][col] == 'Q'){
                return false;
            }
        }
        //45斜对角
        for(int i=row-1,j=col-1; i>=0 && j>=0; i--,j--){
            if(path[i][j] == 'Q'){
                return false;
            }
        }
        //135斜对角
        for(int i=row-1,j=col+1; i>=0 && j<=n-1; i--,j++){
            if(path[i][j] == 'Q'){
                return false;
            }
        }
        return true;
    }
}

总结

        树的每一层row代表棋盘的一行,里面的for循环代表棋盘的一列。row从0开始,当row到达n,说明走出棋盘了,作为叶子节点可以收集结果。

        如果某个位置设置为Q,加入棋盘后导致棋盘不合法(同行、同列、同斜线),就要剪枝,但是剪枝是需要知道当前位置的row和col,所以把剪枝写在for循环里面,只有当前位置合法,才修改成Q,然后递归下一行row+1。如果不合法,直接跳过当前col,进入for循环的下一层循环。

        判断位置是否合法,需要判断同列、同斜线,其中同斜线有两种情况,不要漏了。而且同一行不用判断,因为每调用一次backTracking,row都+1,相当于row一直向下走不会同一行。

37.解数独

题目

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例 1:

输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

代码

class Solution {
    public void solveSudoku(char[][] board) {
        backTracking(board);
    }
    public boolean backTracking(char[][] board){
        for(int i=0; i < 9; i++){
            for(int j=0; j < 9; j++){
                //已经填入了数字
                if(board[i][j] != '.'){
                    continue;
                }
                for(char k = '1'; k <= '9'; k++){
                    if(judge(i,j,k,board) == true){
                        board[i][j] = k;
                        //确定了位置[i][j],递归下一个位置[i][j+1]
                        //如果这里没有返回true,说明board[i][j] = k的条件下,下面是没有数独的解的
                        if(backTracking(board)){
                            return true;
                        };
                        board[i][j] = '.'; //下一个位置[i][j+1]找不到,说明这个k是错误解,要恢复成.,继续判断下一个数组k
                    }
                }
                //53,53x的1-9都不行,说明数独无解,直接返回false,会终止
                return false;
            }
        }
        //两个for循环走完,还没返回,棋盘已经走完了,得到了唯一解
       return true; 
    }

    public boolean judge(int row,int col,char k,char[][] board){
        //判断同一行
        for(int i = 0; i < 9;i++){
            if(board[row][i] == k){
                return false;
            }
        }
        //判断同一列
        for(int i = 0; i < 9;i++){
            if(board[i][col] == k){
                return false;
            }
        }
        //判断同一个九宫格
        int starti = row / 3 * 3;
        int startj = col / 3 * 3;
        for(int i = starti; i < starti + 3; i++){
            for(int j = startj; j < startj + 3; j++){
                if(board[i][j] == k){
                    return false;
                }
            }
        }
        return true;
    }

}

总结

        两个for循环用于确定9*9棋盘的每一个位置,再用一个for循环确定该位置选[1-9]的哪个数字/

        如果数字满足judge条件(不同行不同列不在一个9宫格),board[i][j]确定数字,然后,继续

递归调用棋盘,确定下一个位置的数字board[i][j+1]。

        如果backTracking返回值为true说明,找到了数独的唯一解,直接return true,比如4的下面是

可以找到唯一解,后面的5-9就不用再走了,直接返回true.

        如果for循环确定该位置选[1-9]的哪个数字的循环结束,还没有返回true,就说明9个数字都不

行,说明在这个情况下该数独就是无解的,需要回溯,比如351x,在for循环确定x的时候,循环结束

还是没有返回true,说明在351x的棋盘下,不会存在正确解了,需要回溯1,继续走352。

        如果走棋盘的ij的两个for循环结束,说明棋盘已经走完确定完每一个位置了,直接返回true。

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卫星通讯助力船舶可视化监控:EasyCVR视频汇聚系统新应用

一、背景 随着科技的不断进步和社会治安的日益严峻&#xff0c;视频监控系统已经成为维护公共安全和提升管理效率的重要工具。传统的视频监控主要依赖于有线传输&#xff0c;但受到地域限制、布线成本高等因素的影响&#xff0c;其应用范围和效果受到一定限制。而卫星通讯传输…

【python】tkinter编程三大布局管理器pack、grid、place应用实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【成品设计】基于STM32的单相瞬时值反馈逆变器

《基于STM32的单相瞬时值反馈逆变器》 整体功能&#xff1a; 图13 软件框图 如图13所示&#xff0c;由于本设计中需要通过定时器中断执行一些程序&#xff0c;故首先对中断进行初始化。中断初始化以后即为对串口进行初始化&#xff0c;总共初始化了两个串口&#xff0c;第一个…

攻防演练之-成功的钓鱼邮件溯源

书接上文&#xff0c;《网络安全攻防演练风云》专栏之攻防演练之-网络安全产品大巡礼二&#xff0c;这里。 演练第一天并没有太大的波澜&#xff0c;白天的时间过得很快。夜色降临&#xff0c;攻防演练中心内的灯光依旧明亮。对于网络安全团队来说&#xff0c;夜晚和白天并没有…

2024 年勒索软件将比以往更加残酷

如今&#xff0c;世界各地的人们去学校、去医院或去药店时&#xff0c;都会被告知&#xff1a;“抱歉&#xff0c;我们的计算机系统瘫痪了。” 罪魁祸首往往是在世界另一端活动的网络犯罪团伙&#xff0c;他们会要求人们支付系统访问费用或安全归还被盗数据。 尽管警方加大打…

Python数据分析与机器学习在医疗诊断中的应用

文章目录 &#x1f4d1;引言一、数据收集与预处理1.1 数据收集1.2 数据预处理 二、特征选择与构建2.1 特征选择2.2 特征构建 三、模型选择与训练3.1 逻辑回归3.2 随机森林3.3 深度学习 四、模型评估与调优4.1 交叉验证4.2 超参数调优 五、模型部署与应用5.1 模型保存与加载5.2 …

数据治理新视角:质量与真实度提升,让数据更有价值!

在这个信息爆炸的时代&#xff0c;数据已经成为企业决策的重要依据。然而&#xff0c;数据的质量与真实度却往往成为制约其价值发挥的关键因素。本文将为您揭示数据治理的新视角&#xff0c;探讨如何提升数据质量与真实度&#xff0c;让数据真正发挥其应有的价值&#xff01; 数…

机器学习与数据挖掘知识点总结(二)分类算法

目录 1、什么是数据挖掘 2、为什么要有数据挖掘 3、数据挖掘用在分类任务中的算法 朴素贝叶斯算法 svm支持向量机算法 PCA主成分分析算法 k-means算法 决策树 1、什么是数据挖掘 数据挖掘是从大量数据中发现隐藏在其中的模式、关系和规律的过程。它利用统计学、机器学…

GaussDB技术解读——GaussDB架构介绍(三)

目录 9 智能关键技术方案 智能关键技术一&#xff1a;自治运维系统 智能关键技术二&#xff1a;库内AI引擎 智能关键技术三&#xff1a;智能优化器 10 驱动接口关键技术方案 GaussDB架构介绍&#xff08;二&#xff09;从数据持久化存取层(DataNode)关键技术方案、全局事…

记一次 .NET某工控视觉自动化系统 卡死分析

一&#xff1a;背景 1. 讲故事 今天分享的dump是训练营里一位学员的&#xff0c;从一个啥也不会到现在分析的有模有样&#xff0c;真的是看他成长起来的&#xff0c;调试技术学会了就是真真实实自己的&#xff0c;话不多说&#xff0c;上windbg说话。 二&#xff1a;WinDbg …

通用大模型与垂直大模型:双轨并进的人工智能未来

在人工智能(AI)的浩瀚宇宙中&#xff0c;大模型以其强大的学习能力和广泛的适用性&#xff0c;正逐步成为推动技术进步和产业革新的核心动力。在这股浪潮中&#xff0c;通用大模型与垂直大模型如同两颗璀璨的星辰&#xff0c;各自散发着独特的光芒&#xff0c;共同照亮了AI发展…

用python脚本转换图片分辨率

一、使用说明 确定已经安装python&#xff0c;且版本3.6以上&#xff0c;可以用下面指令查看python版本&#xff1a;python --version 配置环境&#xff0c;第一次使用先配置环境&#xff0c;后面不需要 把要转换的图片放到"img"文件夹下 转换&#xff0c;结果保存…

Spring Security——基于MyBatis

目录 项目总结 新建一个项目 pom.xml application.properties配置文件 User实体类 UserMapper映射接口 UserService访问数据库中的用户信息 WebSecurityConfig配置类 MyAuthenticationFailureHandler登录失败后 MyAuthenticationSuccessHandlerw登录成功后 WebSecur…

c++实现二叉搜索树(中)

小吉我今天更新了&#xff0c;惊不惊喜&#xff0c;意不意外&#xff0c;更新频率非常好&#xff08;棒棒的&#xff09;。小吉计划把二叉搜索树的知识更新完&#xff08;预计在这几天更完&#xff09;&#xff0c;然后会有一段时间停更&#xff0c;因为小吉我要准备期末考试&a…

5-1RT-Thread互斥量

5-1RT-Thread互斥量 互斥量斥量的管理方式 互斥量 互斥量又称为互斥型信号量&#xff0c;是一种特殊的二值信号量。以超市的储物柜为例&#xff0c;当用户A存入物品并关闭柜门&#xff0c;则用户A就获得了此格柜子的使用权。此时其他用户无法使用此个柜子&#xff0c;只有当用户…

Idea jdk配置的地方 启动时指定切换的地方

jdk 配置的地方 项目sdk 所在位置 管理添加或删除的地方&#xff0c;增加后&#xff0c;可以在在上面切换 启动时指定版本

正点原子imx6ull 进度条颜色、logo位置上偏或色偏等问题

正点原子imx6ull 进度条改颜色 logo位置上偏或显示色偏等问题 开机进度条logo问题进度条界面全屏logo位置上偏进度条界面logo其他问题进度条界面去掉中间这条杠 uboot界面logo问题不显示uboot界面的打印信息uboot显示logo不理想uboot不显示logo 开机进度条logo问题 进度条界面…

媲美Sora,免费使用!带物理模拟的,文生视频模型

6月13日&#xff0c;知名3D建模平台Luma AI发布最新文生视频模型Dream Machine&#xff0c;向所有用户免费开放使用。 Dream Machine除了支持文本之外&#xff0c;还可使用图片作为引导来生成视频&#xff0c;其生成的视频质量、动作一致性、色彩、光影、饱和度、运镜等方面&a…

EE trade:港股开户指南及所需条件

开通港股账户是许多投资者希望参与香港股票市场的重要步骤。以下是详细的港股开户要求和条件&#xff0c;以及开户流程和注意事项。 一、港股开户的基本条件 1. 证券账户及资金要求 A股证券账户&#xff1a;个人客户申请开通港股账户&#xff0c;需要已经开通上海或深圳的A股…

【YOLOv5/v7改进系列】改进池化层为RT-DETR的AIFI

一、导言 Real-Time DEtection TRansformer&#xff08;RT-DETR&#xff09;&#xff0c;是一种实时端到端目标检测器&#xff0c;克服了Non-Maximum Suppression&#xff08;NMS&#xff09;对速度和准确性的影响。通过设计高效的混合编码器和不确定性最小化查询选择&#xf…