html数独游戏源代码,数独游戏求解程序(附源代码)

数独游戏规则

是一种源自18世纪末瑞士的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。

数独的玩法逻辑简单,数字排列方式千变万化。不少教育者认为数独是锻炼脑筋的好方法。

计算机算法简介

本文所讨论的算法是一种通用算法,虽然不能说是最快的算法,但却可以求解所有的数独游戏。

算法准备:

1、一个可能性:表示某个格子可能填写的数字。

2、可能性数目:表示某个格子可能性的数量。为0表示已经确定。

3、区域标志:表示某个格子所在区域(小九宫)的ID,所有区域标志都是预定义的。

4、确定数量:表示所有数字已经确定的格子的数量,为81时则表示已经找到解。

5、整个九宫格用三个矩阵表示:可能性矩阵,数目矩阵,区域标志矩阵

算法的基本思想:

步骤1、将所有未确定的格子的可能性定义为0xFFFF(即所有数字都可能),可能数目为9。

步骤2、寻找所有确定的格子A(可能数目为0),在所有与A同行、同列和同区域的未确定的格子的可能性中减去与A相同的可能性。例如:A确定为9,则与A同行、同列和同区域(区域标志相同)的未确定的格子的可能性与0xFEFF按位与(除去可能性9),并将其可能性数目减少。

在除去可能性的过程中如果发现某个格子B的可能性数目由1减小为0,说明B和A只能取相同的数字,这可能是题目本身无解引起,也肯能是由于步骤3中搜索方向不对引起的,可认为此方向的搜索无解,退出这一方向的搜索。定义这个检查为唯一性检查。

步骤3、寻找所有未确定格子中可能性数目最少的格子M,如果M的可能性数目为1,则确定M:将M的可能性数目定义为0,并把确定数量加1,如果此时确定数量达到81,则报告找到解,否则,在所有与M同行、同列和同区域的未确定的格子的可能性中减去与M相同的可能性,并进行唯一性检查。然后重复步骤3。

如果M的可能性大于1,则把M假设为所有M的可能性,分多个方向进行搜索,在每一个搜索方向重复步骤3(这个可以用递归来实现)。

算法性能

本算法可以在50毫秒以内求解任意有解的数独游戏。

程序运行画面

a4c26d1e5885305701be709a3d33442f.png

程序下载

算法核心代码

由于篇幅限制,不能将所有代码贴出来,只贴一些核心的代码,通过研究这些代码已经可以实现本程序。您也可以参照《数独程序开源》中的程序。

// 优化

int CNumMatrix::Optimize()

{

int x, y;

int i;

bool changed = true;

while(changed)

{

changed = false;

for(x = 0; x <

m_iSize; x++)

{

for(y = 0; y <

m_iSize; y++)

{

if(NumTrans(m_i16mMatrix[x][y])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值