代码随想录:回溯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加入resif(row == n){List<String> list = new ArrayList<>();for(char[] c : path){ //获取棋盘的每一行char[]String s = String.copyValueOf(c); //把char[]转为Stringlist.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行的QbackTracking(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.mzph.cn/bicheng/27331.shtml

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

相关文章

【深度学习】Transformer分类器,CICIDS2017,入侵检测,随机森林、RFE、全连接神经网络

文章目录 1 前言2 随机森林训练3 递归特征消除 RFE Recursive feature elimination4 DNN5 Transformer5.1. 输入嵌入层&#xff08;Input Embedding Layer&#xff09;5.2. 位置编码层&#xff08;Positional Encoding Layer&#xff09;5.3. Transformer编码器层&#xff08;T…

堆的实现及其应用

堆的概念 堆是完全二叉树&#xff0c;分为大堆和小堆。大堆&#xff1a;任何一个父亲都大于等于孩子&#xff0c;小堆&#xff1a;任何一个父亲都小于等于孩子。 堆的实现 目录 typedef int HPDataType;typedef struct Heap { HPDataType* a;int size;int capacity; }HP;//交…

高考志愿填报秘籍:未来篇

选择适合自己的大学和专业&#xff0c;对广大考生来说至关重要。从某种程度上来说&#xff0c;决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿&#xff0c;选择适合自己的大学和专业&#xff0c;本公众号将推出如何用AI填报高考志愿专栏文章…

C语言之操作符

目录 一、二进制 原码、反码、补码 二、移位操作符 位操作符 三、 逗号表达式 四、下标访问[]、函数调用() 五. 操作符的属性 整型提升 算术转换 六、总结 一、二进制 其实2进制、8进制、10进制、16进制是数值的不同表示形式而已。 其实10进制是生活中经常使用的&am…

MPLS的配置

1、IP可达--- 使用路由协议全网可达 2、配置 MPLS ——LDP [r2]mpls lsr-id 2.2.2.2 必须先定义 mpls 的router-id&#xff0c;要为本地设备的真实ip地址&#xff0c;且邻居可达&#xff0c;因为该地址将用于建立 TCP 会话&#xff0c;建议使用环回地址 [r2]mpls 再开…

嵌入式微处理器重点学习(二)

影响cache命中率的因素 影响Cache命中率的因素主要包括以下几个方面&#xff1a; Cache大小&#xff1a;一般来说&#xff0c;Cache的大小越大&#xff0c;其能够存储的数据也就越多&#xff0c;因此可能缓存更多需要访问的数据&#xff0c;从而提高命中率。但是&#xff0c;增…

MySQL为什么需要事务回滚机制

在MySQL中事务回滚通过日志完成&#xff0c;所有事务进行的修改都会先记录到回滚日志中&#xff0c;然后再对数据库中的对应行进行写入。当事务被提交后就无法回滚了。 回滚日志的作用&#xff1a; 能够在发生错误或用户执行rollback时提供回滚的相关信息。 在整个系统发生崩溃…

Sklearn简介、安装教程、入门学习

当谈到sklearn&#xff08;scikit-learn&#xff09;教程时&#xff0c;以下是一个清晰、分点表示和归纳的概述&#xff0c;结合了参考文章中的相关信息&#xff1a; 1. Sklearn简介 定义&#xff1a;Scikit-learn&#xff08;sklearn&#xff09;是Python中用于机器学习的开…

类别朴素贝叶斯CategoricalNB和西瓜数据集

CategoricalNB 1 CategoricalNB原理以及用法2 数据集2.1 西瓜数据集2.2 LabelEncoder2.3 OrdinalEncoder 3 代码实现 1 CategoricalNB原理以及用法 &#xff08;1&#xff09;具体原理 具体原理可看&#xff1a;贝叶斯分类器原理 sklearn之CategoricalNB对条件概率的原理如下&…

粉丝经济时代:微信订阅号如何助力中小企业增长

在数字化浪潮席卷全球的今天&#xff0c;微信订阅号凭借其独特的优势&#xff0c;成为了中小企业数字化出海的重要工具。作为NetFarmer&#xff0c;我们致力于帮助企业充分利用这一平台&#xff0c;推动业务发展和市场拓展。今天将深入探讨微信订阅号的概念、用途、使用方法、适…

【驱动】使用fdisk、parted等命令制作SD启动卡

1、检查文件大小 计算烧写的文件系统大小 和 SD卡的大小,判断SD是否可以装下文件系统 1.1 计算文件系统大小 1)在终端中输入命令 $ du ./filesystem -b --max-depth=0 661447340 ./filesystem2)在脚本中计算 data_size=$(du ./filesystem -b --max-depth=0 | gre…

mac安装高版本git(更新git)

问题 问题&#xff1a;新下载的idea&#xff0c;此idea的版本较高&#xff0c;但是在工作发现这个版本的git存在一定漏洞会导致一些信息泄露问题。 1.安装Homebrew 对于Mac更新git&#xff0c;最简单的就是使用brew命令。所以我们首先下载homebrew。已下载的同学忽略直接下一…

【数据结构陈越版笔记】进阶实验1-3.1:两个有序序列的中位数

我这答案做的可能不对&#xff0c;如果不对&#xff0c;欢迎大家指出错误&#xff0c;思路大部分直接写在注释中了。 进阶实验1-3.1&#xff1a;两个有序序列的中位数 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列 A 0 , A 1 , . . . , A n −…

JavaScript clearInterval 清除页面所有定时器

清除页面所有定时器&#xff1a; var time setInterval(() > {console.log("hello world") }, 10000); //清除 for(var i 1;i<time;i){clearInterval(i); }还可以用&#xff1a; 这种方法可以确保页面上所有的定时器都被有效地清除&#xff0c;以防止它们继…

Oracle 排查慢SQL

Oracle 排查慢SQL select * from v s q l a r e a w h e r e r o w n u m < 10 ; s e l e c t ∗ f r o m v sqlarea where rownum<10; select * from v sqlareawhererownum<10;select∗fromvsql where rownum<10; select * from dba_hist_sqltext where rownum<…

ES升级--05--快照生成 和备份

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 备份ES数据1.关闭集群自动均衡2.执行同步刷新3.停止集群节点的Elasticsearch服务4.修改Elasticsearch配置文件&#xff0c;开启快照功能&#xff0c;配置仓库目录为…

第一百零九节 Java面向对象设计 - Java抽象类和方法

Java面向对象设计 - Java抽象类和方法 Java可以定义一个类&#xff0c;其对象不能被创建。 它的目的只是表示一个想法&#xff0c;这是其他类的对象共有的。 这样的类称为抽象类。 语法 我们需要在类声明中使用 abstract 关键字来声明一个抽象类。 例如&#xff0c;下面的…

[240614] 微软推迟发布 Recall AI 功能 | YouTube 尝试在服务器端注入广告

目录 微软推迟发布 Recall AI 功能YouTube 尝试在服务器端注入广告 微软推迟发布 Recall AI 功能 微软表示&#xff0c;由于担心隐私风险&#xff0c;不会在下周推出 “Recall” 功能&#xff0c;这是一项跟踪计算机使用情况的 AI 功能 Recall 功能能跟踪网页浏览&#xff0c…

微信群发机器人.使用指南.

0.简介 1.介绍 微信群发机器人是用来群发微信消息的工具,通过控制电脑的键盘和鼠标操作微信app来实现群发.支持的消息类型有:文字,图片,视频,文件,小程序,位置等. 群发机器人也可以将微信联系人中的信息保存到电脑csv表格中,以供分析. 因其是通过模拟用户操作鼠标键盘来实现群…

the histogram of cross-entropy loss values 交叉熵损失值的直方图以及cross-entropy loss交叉熵损失

交叉熵损失值的直方图在机器学习和深度学习中有几个重要的作用和用途&#xff1a; 评估模型性能: 直方图可以帮助评估模型在训练数据和测试数据上的性能。通过观察损失值的分布&#xff0c;可以了解模型在不同数据集上的表现情况。例如&#xff0c;损失值分布的形状和范围可以反…