数独的生成

  • 问题分析

问题描述:数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个九宫格内的数字均含1-9,不重复

要求:设计算法随机生成不同难度的数独游戏,阐述如何评价所生成数独的难度。

  • 设计思路

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

要实现数独的生成,就要先理清每一个位置的约束条件,经我们小组讨论发现,每个位置的数需要满足四个约束条件:

首先,这个格子里不能有数字,即为空

其次,同一行不能有相同数字

再次,同一列不能有相同数字

最后,同一个九宫格不能有相同数字

用算法的形式把这四个约束条件表现出来,就是数独的生成。

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

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

  • 算法设计

数独求解:

首先,要先确定该数独中空格的数量以及位置,用count记录空格的数量,用blank数组记录所有需要填的空格的坐标。

数独的生成_第1张图片

然后,定义一个初始坐标top,使初始坐标top=0,利用一个双循环求解。数独的生成_第2张图片

进行第二部后,会有一部分空格需要填的数不唯一,因此需要进行试填,从而使数独能更好的解决。定义a,b记录当前top指向的元素作为当前试填空格的坐标,利用循环从1-9依次试填并检验当前空格内填入的数字是否可行,我们定义一个变量ok表示当前空格内填入的数字是否可行,当ok=1时表示可行,ok=0时表示不可行。如果填入的数字可行,top+1进行下一个空格的试填,最终求解。

数独的生成_第3张图片

将一个数独代入进行测验。

数独的生成_第4张图片

测验结果

数独的生成_第5张图片

你可能感兴趣的:(算法,数据结构)