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
学习学习