【回溯法的应用】leetcode37 - 解数独

这篇博客探讨了如何利用回溯法来解决数独问题。计算机通过尝试填入1-9的数字并判断其合法性,遇到非法情况时进行回溯。回溯条件包括在同一行、列和九宫格内不能有重复数字。文章详细解释了回溯法的实现,包括递归和非递归两种方式,并给出了无解数独的情况处理。
摘要由CSDN通过智能技术生成

leetcode传送门

关于回溯法

参考这里

计算机解数独的一种思路

计算机有着高速运算能力,因此不用像人解数独一样讲究技巧(每次随机瞄一个位置,能用排除法得到唯一结果的直填,或者有配对数一定填在特定的相同数量格子里时其他格子可直接排除这些数,等)。
计算机可以在每个空格子里试填1-9的数,填好之后往后继续填,填到填不了的时候,表明之前填的是有错误的,需要回溯。
比如说,下面就是leetcode该题给出的示例九宫格(侵删)
在这里插入图片描述

回溯条件

首先我们需要一个回溯用的函数,即判断当前填进去的数是否合法(不合法的填进去直接就错了,都不用往后跟)
举个例子(借一下leetcode题解的那个图),这里蓝色是填上去的数(在判定条件中返回了true),白底色的数是题目原有的。在填到第1行第9列这个格子的时候,第一行只剩6这个选项,而6已经在同一列上(以及同一个9宫内)存在,因此这个格子实际上从1-9都是不合法数字了,因此需要回溯。比起暴力穷举法,在这里回溯可以省掉大概9^72次尝试。
leetcode题解回溯示意图那么分析以下数字填进去在什么情况下是非法的。非法数字规则的算法在leetcode上也有题目,具体就是,这个数字填进去后,在同一行不能有重复数字,在同一列不能有重复数字,在同一个九宫内不能有重复数字。由于一个格子内填数对全局的影响仅限于该格所在列、行与九宫,因此分别给予判断条件,即可实现合法性判断。其他无关元素无需判断。
每一项判断条件的判断方法为:这9个格子里是否已经存在待填数字。用一个重复9次的循环即可。判断九宫的比较复杂,需要定位到所在的九宫,涉及到九宫的编号、for循环范围限制的精确计算问题,可用草稿纸演示一遍思路。

bool legalInput(int arr[][9], int in_x, int in_y, int in_val){
   
	//判断输入/填数的合法性
	//参数:arr 待填九宫格、(in_x,in_y)待填坐标,in_val 待填数字
	//return true返回可填,false表示不合法
	if(in_x < 0 || in_x >= 9 || in_y < 0 || in_y >= 9 || in_val <= 0 || in_val > 9)return false;	//无效输入
	int i,j;
	for(i = 0;i < 9; i++
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值