python数独问题

本想用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]

猜你喜欢

转载自blog.csdn.net/qq_42402381/article/details/83031902