前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Leetcode][python]Sudoku Solver/解数独

[Leetcode][python]Sudoku Solver/解数独

作者头像
蛮三刀酱
发布2019-03-26 16:24:23
8600
发布2019-03-26 16:24:23
举报
文章被收录于专栏:蛮三刀的后端开发专栏

题目大意

计算数独,假设解唯一

解题思路

回溯法,深度优先

代码

这一题注释写的很多,因为比较复杂头疼中

代码语言:javascript
复制
class Solution(object):

    seen = set()

    def isValue(self,board,x,y):
        # 判断符合,就是上一题
        c = board[x][y]
        if (x, c) in self.seen or (c, y) in self.seen or (x/3, y/3, c) in self.seen:
            return False
        self.seen.add((x, c))
        self.seen.add((c, y))
        self.seen.add((x/3, y/3, c))
        return True

    def dfs(self,board):
        for i in range(9):
            for j in range(9):
                if board[i][j] == '.':
                    for k in '123456789':
                        # 向第一个找到的空格填写了数字
                        board[i][j] = k  
                        # 左边验证该数字是符合标准的,右边验证之后一个数字是否正确(回溯法)
                        if self.isValue(board,i,j) and self.dfs(board):  #如果这两个and前后交换顺序就TLE
                            return True
                        board[i][j] = '.'
                    # 该False表示如果都不正确,之前一直没返回True 
                    return False
        # 这个True是每一行的最后如果没有数了,说明该行都填写上了,所以返回True这样self.dfs(board) = True,该行结束
        return True

    def solveSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        for i in range(9):
            for j in range(9):
                c = board[i][j]
                if c == '.':
                    continue
                self.seen.add((i, int(c)))
                self.seen.add((int(c), j))
                self.seen.add((i/3, j/3, int(c)))
        print self.seen
        self.dfs(board)

总结

上一题hashtable的解法效率很高,想挪过来判断,但始终没修改成功,以后有空改好它,在这里做备份。

代码语言:javascript
复制
class Solution(object):

    seen = set()

    def isValue(self,board,x,y):
        # 判断符合,就是上一题
        c = int(board[x][y])
        if (x, c) in self.seen or (c, y) in self.seen or (x/3, y/3, c) in self.seen:
            print 'buxing'
            return False
        self.seen.add((x, c))
        self.seen.add((c, y))
        self.seen.add((x/3, y/3, c))
        return True

    def dfs(self,board):
        for i in range(9):
            for j in range(9):
                if board[i][j] == '.':
                    for k in '123456789':
                        board[i][j] = k  # 向第一个找到的空格填写了数字
                        # 左边验证该数字是符合标准的,右边验证之后一个数字是否正确(回溯法)
                        if self.isValue(board,i,j) and self.dfs(board):  #如果这两个and前后交换顺序就TLE,说明and确实只判断前面的False就会停止
                            return True
                        # 问题在何时删除这个key,应该是删除上一位已经正确的key
                        # else: 
                        #     self.seen.remove((i, int(k)))
                        #     self.seen.remove((int(k), j))
                        #     self.seen.remove((i/3, j/3, c))
                        board[i][j] = '.'

                    # 该False表示如果都不正确,之前一直没返回True 
                    return False
        # 这个True是每一行的最后如果没有数了,说明该行都填写上了,所以返回True这样self.dfs(board) = True,该行结束
        return True

    def solveSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        for i in range(9):
            for j in range(9):
                c = board[i][j]
                if c == '.':
                    continue
                self.seen.add((i, int(c)))
                self.seen.add((int(c), j))
                self.seen.add((i/3, j/3, int(c)))
        print self.seen
        self.dfs(board)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年09月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目大意
  • 解题思路
  • 代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档