qaz123765 发表于 2017-7-7 00:29:27

本帖最后由 qaz123765 于 2017-7-7 00:47 编辑

shud=[
,
,
,
,
,
,
,
,
]


def uniq(m,n,val):
    for r in shud:
      if r==val:
            return False
    for c in shud:
      if c==val:
            return False
    rx,cx=m//3*3,n//3*3
    for i in range(rx,rx+3):
      for rc in shud:
            if rc==val:
                return False
    return True

def nextc(m,n):
    for mmn in range(n+1,9):
      if shud==0:
            return m,mmn
    for mn in range(m+1,9):
      for nn in range(0,9):
            if shud==0:
                return mn,nn
    return -1,-1
def tryl(m,n):
    if shud==0:
      for k in range(1,10):
            if uniq(m,n,k):
                shud=k
                nextm,nextn=nextc(m,n)
                if nextm==-1 and nextn==-1:
                  return True
                else:
                  valu=tryl(nextm,nextn)
                  if not valu:
                        shud=0
                  else:
                        return True

for i in range(9):
    for j in range(9):
      if shud==0:
            break
    break
tryl(i,j)
print(shud)

kio 发表于 2017-9-7 15:10:38

学习学习

suloman 发表于 2017-9-8 22:36:28

学习来了

cxbpritice 发表于 2017-11-21 10:20:24

学习了

总有理 发表于 2017-11-28 18:19:34

学习了。

nateen 发表于 2017-11-28 23:16:50

感谢楼主

shigure_takimi 发表于 2017-12-2 12:21:01

{:5_91:}

walter 发表于 2017-12-3 22:51:04

学习学习!!!!!!!!!

JAY饭 发表于 2018-3-3 21:12:39

执行速度远不如楼主快
s =[,
,
,
,
,
,
,
,
]
s_kong = []   #空白坐标的列表
right = {}#每个空白坐标对应的可选数字组成的列表
s_jiu = [[] for i in range(3)]#s_jiu,s_heng,s_shu分别对应每一个九宫格,每一行,每一列
for i in range(9):            #只含非零数字的列表
    fen = i//3
    if i%3 == 0:
      t1 = []
      t2 = []
      t3 = []
    for j in range(9):
      if s ==0:
            s_kong.append((i,j))
            continue
      if j//3 == 0:
            t1.append(s)
      elif j//3 ==1:
            t2.append(s)
      else:
            t3.append(s)
    if i%3 ==2:
      s_jiu.append(t1)
      s_jiu.append(t2)
      s_jiu.append(t3)

s_heng = [[] for i in range(9)]
s_shu = [[] for i in range(9)]
for i in range(9):
    for j in range(9):
      if s: s_heng.append(s)
      if s: s_shu.append(s)

for i in range(9):   #用right字典将每一个空白位置赋值对应可选的数字列表
    heng = s_heng
    for j in range(9):
      if not s:
            shu = s_shu
            a,b = i//3,j//3
            jiu = s_jiu
            bu = heng + shu + jiu
            right[(i,j)] = [ i for i in range(1,10) if i not in bu]

m = 0# m对应空白列表s_kong的每个元素
visit = []

def tianzi(m):
    x,y = s_kong
    for i in right[(x,y)]: #将每个空白位置可选的元素迭代,筛选不和后面可选元素矛盾的元素
      a,b = x//3,y//3    #对应每个九宫格在s_jiu的位置
      sign = 0         #sign的作用决定是否继续递归下去
      s = i
      if x==8 and y==8:
            print('found')
            for real in s:
                print(real)
            return 1
      visit.append((x,y)) #将已经迭代的位置加入列表,保证后面的移除元素对已经遍历的
      lin = []            #位置没有影响,lin列表的作用记录此次迭代中被移除i元素的位置
      for j in right:   
            if j == x or j ==y or (j//3 ==a and j//3 == b):
                if j not in visit and i in right:#以上是判断是否跟(x,y)在同一行,一
                  lin.append(j)                     #列,或者同一个九宫格,如果是,是不是
                  right.remove(i)          #含有i元素,并且不在visit列表中
                  if len(right)==0:      #如果有位置的对应可选元素为空,终止此次迭代
                        sign=1
                        visit.pop()             #一切动过的元素都还原
                        break
      if sign:
            for l in lin:
                right.append(i)
            continue   #因为条件不符,不再继续往下递归
      if tianzi(m+1) == 1:
            return 1
      visit.remove((x,y))#一旦递归返回上一层,说明此次迭代失败,元素位置还原
      for l in lin:
                right.append(i)
tianzi(m)

LargeCat 发表于 2018-3-4 10:11:13

谢谢!!!!!!!!!!!!!!!!!!!!

dfh93@163.com 发表于 2018-3-4 16:40:04

谢谢楼主,认真学习!

wenweno 发表于 2018-3-17 16:58:42

{:5_108:}

KING_NJ 发表于 2018-3-26 10:44:40

666

达锅 发表于 2018-4-7 22:26:21

看看

grf1973 发表于 2018-5-22 11:22:57

学习

恋糖猫 发表于 2018-5-22 14:00:23

kank

jxhjx 发表于 2018-8-1 20:36:48

想看看结构

拉了盏灯 发表于 2018-8-2 00:19:54

学习学习
⊙⊙!

bly 发表于 2018-8-9 14:47:18

学习学习

子沙 发表于 2018-8-15 06:32:49

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