数独游戏算法

#

#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]

最重要的遍历查找结果函数 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()
    

结果:

时间: 2024-08-25 20:40:09

数独游戏算法的相关文章

[原创][网页游戏]数独生成算法及实例

[ 程序修正 2015/02/23 补充及订正方法:iphone上的Safari会自动对看起来像是电话号码的数字串(包括已经加入连字符或括号格式化过的)添加电话链接,点击之后会询问用户是否想要拨打该号码. 关闭方法: <meta name="format-detection" content="telephone=no" /> 单独开放方法: <a href="tel:13800138000">13800138000<

数独游戏的设计与实现

前景:数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 然而如何制作出这个游戏?首先要了解它的规则: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件:在空

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)

Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. Note: A valid Sudoku boa

《数独游戏的设计与实现》

数独游戏的规则很简单,只需要在空格初填入1~9的数字,并保证每个数字在每个九宫格内只能出现一次,且每个数字在每一行.每一列也只能出现一次,而一半的游戏过程是系统随机生成一个棋局,然后玩家需要在空白处填上相应的数字使其满足游戏的规则. 完成过程:绘制一个9*9的九宫格,设计了简单和困难两种难度,设置其中几个格子的数字,使其形成一个数独游戏,然后通过X,Y轴获取用户输入的数字. 设计与实现思想:运用遍历算法完成九宫格的获取 遇到的问题与解决方法:因为之前没有学习过安卓,从现在才开始慢慢接触,只能上网

java程序计算数独游戏

兴趣来了,写了个简单的数独游戏计算程序,未做算法优化. 通过文件来输入一个二维数组,9行,每行9个数组,数独游戏中需要填空的地方用0来表示.结果也是打印二维数组. 1 import java.io.File; 2 import java.util.List; 3 //代表数独中的一个单元格位置 4 public class Cell { 5 6 // 所在行 7 public int row; 8 // 所在列 9 public int colum; 10 // 值 11 public int

Swift数独游戏优化&mdash;&mdash;C++与OC混编、plist自动生成

一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的.   但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Terminal的重定向功能来实现输出的,这样不能查看程序的实际运行状态信息. 2.C++编写的代码不能直接生成plist文件,而OC有直接的API可以生成plist文件.(当我前几天刚知道的时候我感觉之前用C++生成plist是有多勇敢)   二.如何进行C++与OC混编? 1.OC文件后缀改为"mm&quo

【DFS】数独游戏

DFS(深度优先搜索): 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点.整个进程反复进行直到所有节点都被访问为止.属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n).(一条路走到黑,直到走不下去才往回走) 基本模板: int check(参数) { if(满足条件) return 1;

[华为机试练习题]44.24点游戏算法

题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:24点游戏算法 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector&