本帖最后由 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)
学习学习
学习来了
学习了
学习了。
感谢楼主
{:5_91:}
学习学习!!!!!!!!!
执行速度远不如楼主快
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)
谢谢!!!!!!!!!!!!!!!!!!!!
谢谢楼主,认真学习!
{:5_108:}
666
看看
学习
kank
想看看结构
学习学习
⊙⊙!
学习学习
学习学习