python算法之利用回溯算法解数独

本文介绍了如何使用回溯算法解决数独问题。通过模拟走迷宫的过程,对待填的每个空格进行尝试,遇到错误则回溯,直至找到正确解决方案。文中还强调了在每次假设后必须将格子还原为0,以避免数字冲突导致死局。最后展示了实现该算法的Python代码。
摘要由CSDN通过智能技术生成

利用回溯算法解数独

小明最近对数独着迷,在玩游戏的时候,计算机程序能够立刻的出答案,好奇的它想知道计算机是怎么得出结果的。数独的游戏规则是根据盘面上的已知数字推理出空格里的数字,要求每一行、每一列、每一个粗线格中均含1~9,且不重复。

问题求解:

面对这样的问题,没有像公式一样的直接解决方式,所以只能靠尝试。就像在走迷宫,没有地图没所以面对每一个岔路口都只能以探索的形式深入,一旦发现路线不对就返回岔路口,选择另一个分支。

把这个比喻用在数独上的话,每一个空格就是一个岔路口,而每一个岔路口都有9种选择。我们肯定末端有一个出口。那么从第一个岔路口出发。假设第1各空格种的数字:1不可以,2也不可以,3可以。
在这里插入图片描述

接下来假设第二个空格,1、2、3都不可以,4可以。

这样一直假设下去,如果盘面上的数字相互矛盾则改变上一格的数字,在次尝试,当我们到达最后一个空格并且成功填入数字时,即可输出答案。

注意:输出答案的前提是题目有解。如果题目有两个或更多答案,程序可输出所有答案。

数独解题思路图:
在这里插入图片描述

注意:每一次假设后都要把格子还原回0,以便下一次假设时盘面上的数字不冲突。如果不归零,那么可能陷入死局后退回到第一个空格时,第二个空格里已经有了9,这会影响我们的判断。

最终代码:

class Solution():
    def solveSudoku(self,board):
        self.helper(board,0)

    def helper(self,board,index):
        if index >= 81:   #如果盘面已满
            self.printSolution(board)    #输出结果
            return            #返回上一格
        if board[index] == 0:    #如果当前格为空格
            for i in range(1,10):   #依次假设1~9
                if self.isValid(board,index
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎明之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值