题目

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

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

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

思路

使用暴力破解是不现实的,其需要 9^81次运算。

因此与数独相同,都需要用到回溯的思想。

其算法可以简化为:

1.从头开始选择到一个空白格

2.选择数字 1-9中的一个,判断是否符合标准(不能重复出现在行,列,3*3方格中)

  2.1 填入数字

  2.2 检查其是否已经找出了数独的解

    2.2.1 若抵达最后一格,获得数独的解

    2.2.2 若没有抵达最后一格,放置下一个数字

    2.2.3 若不存在解,删除当前数字

实现

  1. class Solution:
  2. def solveSudoku(self, board: List[List[str]]) -> None:
  3. """
  4. Do not return anything, modify board in-place instead.
  5. """
  6. flag = False
  7. line = [[]for i in range(9)]
  8. arr = [[]for i in range(9)]
  9. chunk = [[]for i in range(9)]
  10.  
  11. def valid_num(num, row, col):
  12. num_flag = num not in line[row] and num not in arr[col] and num not in chunk[row//3*3+col//3]
  13. return num_flag
  14.  
  15. def remove(num, row, col):
  16. i = line[row].index(num)
  17. j = arr[col].index(num)
  18. k = chunk[row//3*3+col//3].index(num)
  19. del line[row][i]
  20. del arr[col][j]
  21. del chunk[row//3*3+col//3][k]
  22. board[row][col] = '.'
  23.  
  24. def add(num, row, col):
  25. line[row].append(num)
  26. arr[col].append(num)
  27. chunk[row//3*3+col//3].append(num)
  28. board[row][col] = num
  29.  
  30. def check(row, col):
  31. if row == 8 and col == 8:
  32. nonlocal flag
  33. flag = True
  34. else:
  35. if col == 8:
  36. backtrace(row + 1, 0)
  37. else:
  38. backtrace(row, col + 1)
  39.  
  40. def backtrace(row, col):
  41. if board[row][col] == '.':
  42. for m in range(1,10):
  43. d= str(m)
  44. if valid_num(d, row, col) is True:
  45. add(d, row, col)
  46. check(row, col)
  47. if not flag:
  48. remove(d, row, col)
  49. else:
  50. check(row, col)
  51.  
  52. vex = len(board)
  53. for i in range(vex):
  54. for j in range(vex):
  55. get = board[i][j]
  56. k = i//3*3+j//3
  57. if get is not '.':
  58. line[i].append(get)
  59. arr[j].append(get)
  60. chunk[k].append(get)
  61. # flag = False
  62. backtrace(0, 0)

值得注意的是,在check函数中,需要申明nonlocal flag在函数或其他作用域中使用外层(非全局)变量,因为其对flag值进行了修改,否则无法使用。此处不能使用global。

  1.  

leetcode刷题-37解数独的更多相关文章

  1. Leetcode之回溯法专题-37. 解数独(Sudoku Solver)

    Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...

  2. Java实现 LeetCode 37 解数独

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

  3. [leetcode] 37. 解数独(Java)(dfs,递归,回溯)

    37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...

  4. C#LeetCode刷题-哈希表

    哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串   24.2% 中等 18 四数之和   ...

  5. C#LeetCode刷题-回溯算法

    回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配   18.8% 困难 17 电话号码的字母组合   43.8% 中等 22 括号生成   64.9% 中等 37 解数独   45.8% ...

  6. LeetCode刷题 DFS+回溯

    一.DFS介绍 二.LeetCode 实战 LC 17. 电话号码的字母组合 解法思路 解题步骤 代码 LC 79. 单词搜索 解题思路 解题步骤 代码 LC 46. 全排列 解题思路一 解题步骤 代 ...

  7. C#LeetCode刷题-二叉搜索树

    二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III   19.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 327 区间和的个数   29.5% 困难 3 ...

  8. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树)   48.6% 中等 211 添加与搜索单词 - 数据结构设计   39.9% 中等 212 单词搜索 II   27.9% ...

  9. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历   61.6% 中等 95 不同的二叉搜索树 II   43.4% 中等 96 不同的二叉搜索树   51.6% 中等 98 验证二叉搜索树 ...

随机推荐

  1. Homekit_人体感应器

    前置需求: 苹果手机一台 Homekit人体感应一台 USB供电线一根 这款产品内置人体红外感应器,使用圆环设计,增大了其接触面积,使感应变得更加灵敏,重量轻,方便将其粘贴到墙上,同时支持二次开发,如 ...

  2. Android开发学习进程0.18 SharePreference的使用 AIDL

    SharePreference SharePreference是一种持久化存储手段,使用场景很多,如第一次打开时加载的用户协议等.适合小数据单进程的应用.将数据以键值对的形式存储在XML中. 使用方式 ...

  3. 编写高质量代码的50条黄金守则-Day 02(首选readonly而不是const)

    编写高质量代码的50条黄金守则-Day 02(首选readonly而不是const),本文由比特飞原创发布,转载务必在文章开头附带链接:https://www.byteflying.com/archi ...

  4. Android The layout "activity_main" in layout has no declaration in the base layout folder

    报错: The layout "activity_main" in layout has no declaration in the base layout folder; thi ...

  5. 【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察

    摘要: 老大说,我这份用关键词抽取API搞定的用户需求洞察报告,简直比比市场调研的科班人士做得还好. 最近这半个月的午饭,那可是相当不错,市场老大天天请吃饭,不是外面下馆子,就是从家带饺子.说是感谢我 ...

  6. java反序列化——XMLDecoder反序列化漏洞

    本文首发于“合天智汇”公众号 作者:Fortheone 前言 最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDeco ...

  7. 第一篇scrum冲刺博客--Interesting-Corps

    第一篇scrum冲刺博客 一.Alpha阶段各成员任务 鲍鱼铭 任务名称 预计时间 主页页面和探测空间设计及布局实现 6h 主页页面跳转社区功能及社区设计及布局实现 6h 搜索页面跳转.设计及布局实现 ...

  8. latex在线帮助文档

    1.ctex官方网站 http://www.ctex.org/HomePage 2.在线帮助文档 http://www.ctex.org/OnlineDocuments

  9. 大白话带你认识 ZooKeeper !重要概念一网打尽!

    大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 1. 前言 相信大家对 ZooKeeper 应该不算陌生.但是你真的了解 ZooKeeper 到底有啥用不?如果别人/面试官让你给他讲讲对于 ...

  10. React_TODOList 数据增删改查

    ①.功能代码实现: 添加数据 查询数据,展示 删除数据 修改数据 ②.数据持久化操作 localStorage.setItem('key',value) var value = localStorag ...