Leetcode第三十七题:解数独

本文介绍了一种使用回溯法解决数独问题的程序设计思路。通过确保每行、每列及每个3x3宫格内的数字1-9不重复,实现数独的有效求解。文章提供了Python代码实现,并对算法进行了详细解析。

题目:

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

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。

一个数独。

答案被标成红色。

Note:

给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

个人思路:

想着按上一题的大致思路去做,果然错了。。

官方答案推荐:

回溯法

python代码:

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        def backtrace(row,col):
            #换行
            if col == 9:
                return backtrace(row+1,0)
            #遍历完毕,结束
            if row == 9:
                return True
            #有数了,直接下一个
            if board[row][col] != '.':
                return backtrace(row,col+1)
            for curNum in range(1,10):
                #不符合“独”,换数试
                if not isValid(row,col,curNum):
                    continue
                board[row][col] = str(curNum)
                #以这个符合条件的数为基础,再试下一个位置
                if(backtrace(row,col+1)):
                    return True
                #后面的数不符合,回溯,返回原状后换一个数继续试
                board[row][col] = '.'
            #所有数都试过都不行,上一个数要进行回溯换数
            return False
        #上一题的东西,换了一种简单的写法
        def isValid(row,col,curNum) :
            curNum = str(curNum)
            for i in range(9):
                if (board[row][i] == curNum): return False
                if (board[i][col] == curNum): return False
                if (board[(row//3)*3 + i//3][(col//3)*3 + i%3] == curNum):
                    return False
            
            return True
        backtrace(0,0)

反思:

刚开始看一个说的头头是道的答案是错的,琢磨了两天。。。。一度怀疑自己智商有问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值