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

淡淡的烟草味﹌ 2022-06-08 04:48 305阅读 0赞

题目大意

计算数独,假设解唯一

解题思路

回溯法,深度优先

代码

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

  1. class Solution(object):
  2. seen = set()
  3. def isValue(self,board,x,y):
  4. # 判断符合,就是上一题
  5. c = board[x][y]
  6. if (x, c) in self.seen or (c, y) in self.seen or (x/3, y/3, c) in self.seen:
  7. return False
  8. self.seen.add((x, c))
  9. self.seen.add((c, y))
  10. self.seen.add((x/3, y/3, c))
  11. return True
  12. def dfs(self,board):
  13. for i in range(9):
  14. for j in range(9):
  15. if board[i][j] == '.':
  16. for k in '123456789':
  17. # 向第一个找到的空格填写了数字
  18. board[i][j] = k
  19. # 左边验证该数字是符合标准的,右边验证之后一个数字是否正确(回溯法)
  20. if self.isValue(board,i,j) and self.dfs(board): #如果这两个and前后交换顺序就TLE
  21. return True
  22. board[i][j] = '.'
  23. # 该False表示如果都不正确,之前一直没返回True
  24. return False
  25. # 这个True是每一行的最后如果没有数了,说明该行都填写上了,所以返回True这样self.dfs(board) = True,该行结束
  26. return True
  27. def solveSudoku(self, board):
  28. """
  29. :type board: List[List[str]]
  30. :rtype: void Do not return anything, modify board in-place instead.
  31. """
  32. for i in range(9):
  33. for j in range(9):
  34. c = board[i][j]
  35. if c == '.':
  36. continue
  37. self.seen.add((i, int(c)))
  38. self.seen.add((int(c), j))
  39. self.seen.add((i/3, j/3, int(c)))
  40. print self.seen
  41. self.dfs(board)

总结

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

  1. class Solution(object):
  2. seen = set()
  3. def isValue(self,board,x,y):
  4. # 判断符合,就是上一题
  5. c = int(board[x][y])
  6. if (x, c) in self.seen or (c, y) in self.seen or (x/3, y/3, c) in self.seen:
  7. print 'buxing'
  8. return False
  9. self.seen.add((x, c))
  10. self.seen.add((c, y))
  11. self.seen.add((x/3, y/3, c))
  12. return True
  13. def dfs(self,board):
  14. for i in range(9):
  15. for j in range(9):
  16. if board[i][j] == '.':
  17. for k in '123456789':
  18. board[i][j] = k # 向第一个找到的空格填写了数字
  19. # 左边验证该数字是符合标准的,右边验证之后一个数字是否正确(回溯法)
  20. if self.isValue(board,i,j) and self.dfs(board): #如果这两个and前后交换顺序就TLE,说明and确实只判断前面的False就会停止
  21. return True
  22. # 问题在何时删除这个key,应该是删除上一位已经正确的key
  23. # else:
  24. # self.seen.remove((i, int(k)))
  25. # self.seen.remove((int(k), j))
  26. # self.seen.remove((i/3, j/3, c))
  27. board[i][j] = '.'
  28. # 该False表示如果都不正确,之前一直没返回True
  29. return False
  30. # 这个True是每一行的最后如果没有数了,说明该行都填写上了,所以返回True这样self.dfs(board) = True,该行结束
  31. return True
  32. def solveSudoku(self, board):
  33. """
  34. :type board: List[List[str]]
  35. :rtype: void Do not return anything, modify board in-place instead.
  36. """
  37. for i in range(9):
  38. for j in range(9):
  39. c = board[i][j]
  40. if c == '.':
  41. continue
  42. self.seen.add((i, int(c)))
  43. self.seen.add((int(c), j))
  44. self.seen.add((i/3, j/3, int(c)))
  45. print self.seen
  46. self.dfs(board)

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读

    相关 37. 解数

    37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次

    相关 【LeetCode 37】解数

    题目描述 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能

    相关 37. 解数

    37. 解数独 题目描述 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9

    相关 37解数

    //编写一个程序,通过已填充的空格来解决数独问题。 // 一个数独的解法需遵循如下规则: // 数字 1-9 在每一行只能出现一次。 // 数字 1-9 在每一列只