数独游戏算法

#

#author:wuhao

#

#解数独游戏

#

#想法:从(0,0)开始往下遍历,(当然从什么位置开始遍历是无所谓的,只是代码写法可能要有点变化,我是从(0,0)开始往下逐层遍历),首先判断其是否需要填值check(a,i,j),如果需要填值就填上其可能的值保存在FillData(a,i,j),返回的是一个list存放的是其可能的值,最后进行遍历查找正确的结果

 

check函数:

def check(a,i,j):
    if a[i][j]==0: return True
    return False

FillData函数

def FillData(a,i,j):
    if check(a,i,j):            #如果需要数据填充
        list_a=[1,2,3,4,5,6,7,8,9]
        for k in range(9):
            if a[i][k]!=0:      #纵向判断,如果已经溢出了,pass掉
                try:
                    list_a.remove(a[i][k])
                except:pass

            if a[k][j]!=0:      #横向判断,如果已经移除过了,pass掉
                try:
                    list_a.remove(a[k][j])
                except:pass

        for k in range(3):
            if a[int(i/3)*3+k][int(j/3)*3]!=0:
                try:
                    list_a.remove(a[int(i/3)*3+k][int(j/3)*3])
                except:pass
            if a[int(i/3)*3+k][int(j/3)*3+1]!=0:
                try:
                    list_a.remove(a[int(i/3)*3+k][int(j/3)*3+1])
                except:pass
            if a[int(i/3)*3+k][int(j/3)*3+2]!=0:
                try:
                    list_a.remove(a[int(i/3)*3+k][int(j/3)*3+2])
                except:pass
        return list_a
    return a[i][j]
View Code

最重要的遍历查找结果函数 listData

Game_over=False        #初始化未找到结果,找到结果设置Game_over=True

def listData(a,posx,posy,f):
    global Game_over            #Game_over为全局变量而不是局部
    if Game_over==True:return a
    if posx != 8 or posy != 8:
        if check(a,posx,posy):
            data=FillData(a,posx,posy)
            length=len(FillData(a,posx,posy))
            for k in range(length):
                #print("(%s,%s),Gameover=%s"%(posx,posy,Game_over))    用于查看检查结果是否有错
                if Game_over==False:
                    a[posx][posy]=data[k]
                    #f.write(str(a))
                    #f.write("\r\n")
                    listData(a,posx+(posy+1)//9,(posy+1)%9,f)
                else:return a
            if Game_over==False:
                a[posx][posy] = 0
        else:
            listData(a,posx+(posy+1)//9,(posy+1)%9,f)
    else:
        Game_over=True
        a[posx][posy]=FillData(a,posx,posy)[0]
        return a            

主程序

if __name__=="__main__":
    list_a=\
    [
        [8,0,0,0,0,0,0,0,0],
        [0,0,3,6,0,0,0,0,0],
        [0,7,0,0,9,0,2,0,0],
        [0,5,0,0,0,7,0,0,0],
        [0,0,0,0,4,5,7,0,0],
        [0,0,0,1,0,0,0,3,0],
        [0,0,1,0,0,0,0,6,8],
        [0,0,8,5,0,0,0,1,0],
        [0,9,0,0,0,0,4,0,0]
    ]
    f = open("log.txt","w")
    if listData(list_a,0,0,f)==list_a:
         print("此数独无解")
    else:print(list_a)
    f.close()
                                                                                                          #欢迎大家评论交流

 

结果:

 

posted @ 2017-04-07 18:11  一光年太远  阅读(880)  评论(0编辑  收藏  举报