码迷,mamicode.com
首页 > 编程语言 > 详细

数独游戏算法

时间:2017-04-07 20:32:37      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:open   sed   splay   png   return   name   lis   code   game   

#

#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()
    

 

结果:

技术分享

 

数独游戏算法

标签:open   sed   splay   png   return   name   lis   code   game   

原文地址:http://www.cnblogs.com/one-lightyear/p/6679438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!