数独游戏算法
#
#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函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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]
最重要的遍历查找结果函数 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()
#欢迎大家评论交流
结果: