jerryxjr1220 发表于 2017-2-7 10:20:22

python小练习(067):回溯法(深度优先搜索)求解数独问题

数独的求解其实之前已经有分享过,但是目前正好讲解回溯法(深度优先搜索),就顺便拿过来再分享一下。

求解数独问题的过程是非常典型的回溯法的应用。

原始数独:










输出:










源代码:
**** Hidden Message *****

caiyouqian 发表于 2017-2-7 14:11:26

学习,受教了

新手·ing 发表于 2017-2-7 15:44:36

谢谢,学习了

知飞科技 发表于 2017-2-7 16:59:02

厉害

qianlixiaozhuoz 发表于 2017-2-7 17:43:13

高端

荷风香煞 发表于 2017-2-9 02:56:22

学习

余欲渔 发表于 2017-2-10 11:10:46

来学习思路

木木子_666 发表于 2017-3-16 10:57:25

正想要找一些Python习题练习一下,不过这里面的看起来难度挺大

小小王python 发表于 2017-4-24 18:18:02

学习

WelanceLee 发表于 2017-4-25 13:32:41

global a
a = [,
,
,
,
,
,
,
,
]

def check(x, y):
    global a
    flag = 0
    for i in range(9):
      if a == a:
            flag += 1
    for j in range(9):
      if a == a:
            flag += 1
    if flag > 2:
      return False
    else:
      return True
   
def fillblank(x, y):
    global a
    if x == 9:
      input('input a key to stop: ')
      print(a)
      exit()
    if a == 0:
      for i in range(1, 10):
            a = i
            if check(x, y):
                if y < 8:
                  fillblank(x, y + 1)
                else:
                  fillblank(x + 1, 0)
            else:
                continue
      a = 0
    else:
      if y < 8:
            fillblank(x, y + 1)
      else:
            fillblank(x + 1, 0)
      
fillblank(0, 0)

WelanceLee 发表于 2017-4-25 13:40:58

WelanceLee 发表于 2017-4-25 13:32


有个疑问:如果我在fillblank函数判断终止那儿写 if x == 9:return,那么函数会运行很长时间(没有等到结果),这是为甚吗?

a649456500 发表于 2017-4-25 17:40:01

{:5_106:}

M喵狮 发表于 2017-4-25 18:43:18

膜拜大佬

z6112539 发表于 2017-4-27 18:43:36

受教了

jerryxjr1220 发表于 2017-4-27 21:48:54

本帖最后由 jerryxjr1220 于 2017-4-27 21:58 编辑

WelanceLee 发表于 2017-4-25 13:40
有个疑问:如果我在fillblank函数判断终止那儿写 if x == 9:return,那么函数会运行很长时间(没有等到 ...

你的check函数好像不完整吧?
def check(x, y):
    global a
    flag = 0
    for i in range(9):
      if a == a:
            flag += 1
    for j in range(9):
      if a == a:
            flag += 1
    if flag > 2:
      return False
    else:
      return True
你只检查了横行和竖排不能重复,还有9格的呢? 数独的规则是3x3的9格内也不允许有重复数字。

而且你这个算法哪怕写得正确也很难算出来,因为你几乎是在穷举每一个可能的值,那你算算81个格子内,每个格子有9个可能,一共有多少种不同的排列组合? 一共是196627050475552913618075908526912116283103450944214766927315415537966391196809种, 就算每秒钟可以计算100万种,总共需要6e+63年才能算完{:10_256:}

逝痕 发表于 2017-4-28 15:41:46

{:5_91:}

老甲鱼与小甲鱼 发表于 2017-4-28 23:45:29

学习学习

WelanceLee 发表于 2017-4-29 09:38:41

jerryxjr1220 发表于 2017-4-27 21:48
你的check函数好像不完整吧?

你只检查了横行和竖排不能重复,还有9格的呢? 数独的规则是3x3的9格 ...

原来我连玩法都没搞清楚啊,尴了个大尬~{:5_107:}

cngrand 发表于 2017-6-12 11:41:26

学习

P先生 发表于 2017-6-26 09:44:48

页: [1] 2 3
查看完整版本: python小练习(067):回溯法(深度优先搜索)求解数独问题