leetcode 37 数独

判断数字是否填写正确没那么困难,通过check函数。减少时间复杂度,通过传入i,j。
!!!注意然后只返回一个解即可,需要 return。

唯一不同的变化是,题解的回溯函数有一个返回值,它是布尔类型,一旦返回 True,在递归那边就会把 True 传递上去,终止回溯。这一点值得注意。

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        def check(value,i,j,board1):
            for t in range(len(board1)):
                if value ==board1[t][j]:
                    return False
                if value == board1[i][t]:
                    return False
            for t in range((i//3)*3,((i//3)+1)*3):
                for k in range((j//3)*3,(j//3+1)*3):
                    if board1[t][k]==value:
                        if t!=i and k!=j:
                            return False
            return True


        def dfs(i,j,board):
            if j==9:
                return dfs(i+1,0,board)#成功后不往下执行了
            if i==9:
                return True   
            if board[i][j]=='.':
                for value in range(1,10):
                    if check(str(value),i,j,board):
                        board[i][j]=str(value)
                        if dfs(i,j+1,board):#只返回一个解
                            return True
                        board[i][j]='.'
            else:
                return dfs(i,j+1,board)#成功后不往下执行了
        dfs(0,0,board)

也可以先确定可用数字数组。
https://leetcode-cn.com/problems/sudoku-solver/solution/jing-dian-hui-su-fa-jin-shuang-bai-jie-fa-jian-dan/

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务