本想用dfs回溯法解决数独问题的,结果发现好难,现在提供我自己的一种解法,后面有时间再用回溯法做一遍。。。。
#None代表为未确定的数据
A=[
[7,1,2,None,6,None,3,5,8],
[None,6,5,2,None,7,1,None,4],
[None,None,8,5,1,3,6,7,2],
[9,2,4,None,5,6,None,3,7],
[5,None,6,None,None,None,2,4,1],
[1,None,3,7,2,None,9,None,5],
[None,None,1,9,7,5,4,8,6],
[6,None,7,8,3,None,5,1,9],
[8,5,9,None,4,None,None,2,3]
]
def my_dfs():
global A
result=[]
ALL_SET=set({1,2,3,4,5,6,7,8,9,None})#全集
for i in range(9):
for j in range(9):
if A[i][j]==None:
d={}
set_x=set(A[i][k] for k in range(9))#横向的集合
set_y=set(A[k][j] for k in range(9))#纵向的集合
set_x_y=set_x|set_y
data=list(ALL_SET-set_x_y)#总的集合-横向纵向的集合=可能解的集合
d['%s,%s'%(str(i),str(j))]=data
result.append(d)
return result
#判断数独中是否含有未确定的数字
def check(A):
flag=False
for i in range(9):
for j in range(9):
if A[i][j] is None:
flag=True
#A中有None为True
return flag
if __name__=='__main__':
count=1
while check(A=A):
data=my_dfs()
for each in data:
for index,item in each.items():
if len(item)==1:#如果可能解只有一个,那么该点就是这个解
i,j=index.split(',')
A[int(i)][int(j)]=item[0]#将这个解赋值给该点
print('第%d次遍历' % count)
for each in A:
print(each)
count+=1
#重复上述操作,直到A中没有None
运行结果如下:
第1次遍历
[7, 1, 2, 4, 6, None, 3, 5, 8]
[3, 6, 5, 2, None, 7, 1, 9, 4]
[4, None, 8, 5, 1, 3, 6, 7, 2]
[9, 2, 4, 1, 5, 6, 8, 3, 7]
[5, None, 6, 3, None, None, 2, 4, 1]
[1, None, 3, 7, 2, None, 9, 6, 5]
[None, 3, 1, 9, 7, 5, 4, 8, 6]
[6, 4, 7, 8, 3, None, 5, 1, 9]
[8, 5, 9, None, 4, 1, 7, 2, 3]
第2次遍历
[7, 1, 2, 4, 6, 9, 3, 5, 8]
[3, 6, 5, 2, 8, 7, 1, 9, 4]
[4, 9, 8, 5, 1, 3, 6, 7, 2]
[9, 2, 4, 1, 5, 6, 8, 3, 7]
[5, None, 6, 3, None, None, 2, 4, 1]
[1, 8, 3, 7, 2, None, 9, 6, 5]
[2, 3, 1, 9, 7, 5, 4, 8, 6]
[6, 4, 7, 8, 3, 2, 5, 1, 9]
[8, 5, 9, 6, 4, 1, 7, 2, 3]
第3次遍历
[7, 1, 2, 4, 6, 9, 3, 5, 8]
[3, 6, 5, 2, 8, 7, 1, 9, 4]
[4, 9, 8, 5, 1, 3, 6, 7, 2]
[9, 2, 4, 1, 5, 6, 8, 3, 7]
[5, 7, 6, 3, 9, 8, 2, 4, 1]
[1, 8, 3, 7, 2, 4, 9, 6, 5]
[2, 3, 1, 9, 7, 5, 4, 8, 6]
[6, 4, 7, 8, 3, 2, 5, 1, 9]
[8, 5, 9, 6, 4, 1, 7, 2, 3]