leetcode_37. 解数独

举报
悲恋花丶无心之人 发表于 2021/02/03 02:08:32 2021/02/03
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

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

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

空白格用 '.' 表示。

一个数独。

答案被标成红色。

Note:

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

二、解题思路

DFS+回溯

row存储每行使用的数字

col存储每列使用的数字

block存储每个小方块使用的数字

三、代码


  
  1. class Solution:
  2. def solveSudoku(self, board: list) -> None:
  3. """
  4. Do not return anything, modify board in-place instead.
  5. """
  6. row = [[0 for _ in range(9)] for _ in range(9)]
  7. col = [[0 for _ in range(9)] for _ in range(9)]
  8. block = [[0 for _ in range(9)] for _ in range(9)]
  9. # print(row)
  10. # print(col)
  11. # print(block)
  12. for i in range(9):
  13. for j in range(9):
  14. if board[i][j] != '.':
  15. num = ord(board[i][j]) - ord('1')
  16. row[i][num] = True
  17. col[j][num] = True
  18. block[i // 3 * 3 + j // 3][num] = True
  19. def print_board():
  20. for i in range(9):
  21. print(board[i])
  22. print('\n')
  23. def dfs(i, j):
  24. while board[i][j] != '.':
  25. j += 1
  26. if j > 8:
  27. j = 0
  28. i += 1
  29. if i > 8:
  30. return True
  31. for num in range(9):
  32. blockindex = i // 3 * 3 + j // 3
  33. if not row[i][num] and not col[j][num] and not block[blockindex][num]:
  34. board[i][j] = str(1 + num)
  35. row[i][num] = True
  36. col[j][num] = True
  37. block[blockindex][num] = True
  38. # print_board()
  39. if dfs(i, j):
  40. return True
  41. else:
  42. board[i][j] = '.'
  43. row[i][num] = False
  44. col[j][num] = False
  45. block[blockindex][num] = False
  46. # print_board()
  47. return False
  48. dfs(0, 0)
  49. if __name__ == '__main__':
  50. board = [['5', '3', '.', '.', '7', '.', '.', '.', '.'],
  51. ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
  52. ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
  53. ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
  54. ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
  55. ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
  56. ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
  57. ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
  58. ['.', '.', '.', '.', '8', '.', '.', '7', '9']]
  59. # print(str(1 + 8))
  60. s = Solution()
  61. s.solveSudoku(board)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/108595823

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。