c语言 随机生成数独,数独高效随机生成算法的研究与实现

肖波

摘要:数独谜题的随机生成,是在数独基本规则的限制下,向空白盘面中随机填入一些数字,在适当的时机进行求解,根据解的情况,快速定位到一个具有唯一解的布局,并通过减少提示数来提高数独的难度,最终得到一个有效的数独初盘。实验证明,随机生成算法出题的随机性、效率和难度都达到了比较好的效果。

关键词:数独;初盘;随机;生成

中图分类号:TP312 文献标识码:A

文章编号:1009-3044(2019)09-0086-02

Abstract: The method of random generation of sudoku puzzles, is based on the restriction of sudoku basic rules, randomly filling some numbers into the blank grid, solving them at the appropriate time, locating a layout with unique solution quickly according to the situation of the solution, and improving its difficulty by reducing the hints, finally obtaining an effective initial layout of sudoku. Experiments show that the randomness, efficiency and difficulty of the random generation algorithm have achieved good results.

Key words: sudoku; initial layout; random; generation

1 概述

数独(Sudoku)是一种当前非常流行的填数游戏,但与数字的运算毫无关系,主要考察人们的逻辑推理能力和观察能力。数独起源于拉丁方阵,由单元格(Cell)、行(Row)、列(Column)、宫(Box、Block)等元素组成,规则是在每行、每列、每宫的九个单元格中填入数字1-9,不重复。给定一定数量提示数的盘面作为初始条件,称为初盘。根据规则将所有单元格填满得到的盘面称为终盘,也就是数独的解。标准的数独初盘只能对应一个终盘。

对于数独程序,主要需要解决三个问题:数独生成、数独求解、难度评价。目前影响比较大,功能比较完善的数独程序有:Hodoku、Sudoku Explainer。

计算机程序求解数独,一般采用回溯法,对于任意数独初盘,好的算法都可以在一秒内得到解。目前,非常有效的算法,是舞蹈链(Dancing Links)算法。它实际上也是一种回溯算法,巧妙地运用了双向十字链表的数据结构,用空间换取时间,将数独求解转化为一个精确覆盖问题,用C语言实现的算法,在普通的微机上,能够在0.1ms左右对任意标准数独进行求解。

数独初盘的难度评价,是按人解题的思维模式和步骤进行解题时需要用到的规则技巧的难易程度的量化数据而进行汇总统计得到的一个数值。解题规则有可以直接填数的基本规则和根据一定的逻辑推理排除某些空位候选解的中高级规则。目前,Hodoku和Sudoku Explainer提供的难度评价,比较权威。如图1,由芬兰数学家因卡拉设计的难度最大的数独初盘,用它们进行评分,分别是:21342、10.7。但实际上比此题更难的数独初盘还有很多,如图2,难度评分分别是:47784、10.7。数独的难度对于计算机使用回溯法求解来说,是没有什么意义的。

数独的生成比求解复杂,需要使用数独求解算法去验证当前局面解的唯一性。怎样减少求解的次数,降低时间开销,并且保证初盘的难度,是数独生成的算法中不可避免的问题。

常用的生成方法有挖洞法,即挖去一個数独终盘上某些位置上的数,使其形成的局面只有一个解,即做为数独初盘。初始的数独终盘,可根据一定的算法生成,也可以根据某个已知的终盘,进行若干次行列互换或数字的交换等方法得到。在挖洞时,可随机去挖,也可根据一定的规则或固定的模式去挖。使用Hodoku和Sudoku Explainer生成数独,也是基于此方法,采用了一些固定的模式,加入了一些随机因素,其生成的数独初盘的有数位置都是关于中心对称的,生成的数独被广泛应用到各类数独游戏程序中。

2 随机生成算法

采用随机方式生成数独,即从空白的数独盘面开始随机填数,填入的数字不能违背数独的基本规则,并且要保证解的唯一性。在随机填入过程中,判断某个位置是否可以填入一个随机的数是根据这一位置所处行列宫区域中是否已有此数来决定。当填入这一数之后,修改它所处区域的标记信息。当填入的数字达到一定量之后,再进行数独求解,发现是多解数独时,随机选取两个解,在他们的差异位置处随机选择一个填入,再进行求解,这样可以快速定位到当前搜索路径的某个有效分枝,这样反复进行,可根据当前搜索路径,快速定位到最后一个分枝,找到解是唯一的初盘。具体算法的数据表示和实现步骤如下:

2.1 数据表示:

2.2 算法步骤:

1)初始化数据;

2)随机选取一个小于81的数n;

3)随机选取一个1-9的数t,并计算此数对应的二进制标识位 b = 1<

4)判断a[n]是否有数,如果有数,则执行n=(n+1)%81,再执行判断;

5)判断能否将t填入a的第n个位置中,判断法则用 b 与 w中对应区域的标识信息进行逻辑与运算,如果在行列宫中的三次运算都为零,则可填入,执行第6步;若不可填入,则执行n=(n+1)%81,再执行第4步;

6)填入数a[n]=t,设置标识位信息,w[0][n/9] |=b, w[1][n%9] |=b, w[2][n/9+n%9/3] |=b;计数量count加1;

7)当count的值达到某一特定值K时,则执行数独求解,当求解结果有且仅有一个解时,则成功找到一局数独初盘;当无解时,重新从第1步开始执行;当有多个解时,求出两个解,执行第8步;

8)随机选取两个解中相异的数位中的某一个数,填入a中对应的位置,再执行数独求解,当求解结果为有且仅有一个解时,则成功找到一局数独初盘;当有多个解时,求出两个解,再执行第8步;此时不会出现无解的情况;

算法中的K值选择需要根据一定经验来定,如果K值较小,则需要更多次数的数独求解,如果K值较大,初次求解时无解的情况可能较多,需要重新开始甚至反复出现无解。K值至少等于17,因为根据Gary McGuire的团队设计的算法,在2012年提出了不存在16个提示数的标准数独。使用C语言实现本算法,数独求解采用舞蹈链算法,在CPU为Core i5-4950主频3.3GHz的台式机上单线程进行实验,K取不同的值时,进行1000次数独的生成实验,平均所需填数轮次、求解次数、提示数数量、时间消耗统计如下:

根据表1的结果,权衡填数轮次和数独求解次数的时间开销,选取K为25比较适中。普通微机在1ms左右可随机生成一局数独初盘。

按照以上算法,生成的数独初盘,提示数在30左右,难度比较小,只能作为入门级的数独练习,并不实用。为提高难度,需要剔除某些提示数,算法后续步骤:

9)选取a中一个有数的位置,将其置为0,然后进行数独求解,若有多个解,则将此位置的数恢复;若只有一个解,则此位置的数可剔除,再选择下一个有数的位置,重复执行此步,直至最后一个有数的位置。

通过算法的第9步,可剔除一部分提示数,提高数独初盘的难度。但需要多次执行数独求解,增加时间开销。在同等条件下,生成1000局数独初盘的平均统计数据如下:

使用本算法生成10000局数独,然后使用Hodoku进行难度评价,得到的统计结果如下:

在这10000局数独中,其中难度最大的一局如图3所示,使用Hodoku、Sudoku Explainer进行难度评分,分别是23938、9.0,根据Hodoku给出的解题步骤,需要经历55次中高级规则对某些空位的候选解进行排除之后,才能填入第一个数,在第3行第3列填入7。

3 结论

根据此算法,普通微机在5ms左右可以随机生成一局任意难度的数独初盘。在生成过程中,尽可能地使用了随机值,除了数独的基本规则,不再受其他因素的制约,这使得生成的初盘,理论上可以随机分布在基于所有数独初盘所形成的一个深度为81级9叉树的深度尽可能浅的位置。所以本算法在实际的数独游戏或比赛的出题中,是比较有效的,且对于数独的统计分析工作具有一定的意义。当然,因为随机性的原因,本算法也存在不足,不能根据指定的难度级别或所需的解题技巧生成数独初盘,这也正是后续工作需要研究的问题。

参考文献:

[1] 薛海源,蒋彪彬,李永卓.基于“挖洞”思想的数独游戏生成算法[J].数学的实践与认识,2009,39(21):1-7.

[2] 刘延风,刘三阳.基于遗传算法求解数独难题[J].计算机科学,2010,37(3):225-226.

[3] 赵志芳,郭静鑫,杨璐.生成Sudoku的算法研究[J].内江科技,2008(7):22-23.

[4] 王琼,邹晟.数独问题的求解、评价与生成算法的研究[J].南京师范大学学报:工程技术版,2010,10(1):76-79.

[5] 黄祖贤.数独游戏的问题生成及求解算法优化[J].安徽工业大学学报:自然科学版,2015,32(2):187-191.

[6] Timo Mantere,Janne Koljonen.Solving,rating and generateing Sudoku puzzles with GA[C]. Singapore:2007 IEEE Congress on Evolutionary Computation, 2007.

[7] Timo Mantere,Janne Koljonen.Solving and analyzing Sudokus with cultural algorithms[C]. Hong Kong:2008 IEEE Congress on Evolutionary Computation,2008.

[8] Welcome to HoDoKu, a Sudoku generator/solver/trainer/analyzer[EB/OL].http://hodoku.sourceforge.net/.

【通聯编辑:谢媛媛】

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值