“数独”的通用生成和解题思路

        数独(すうどく,Sudoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

        数独求解即填入未知元素并满足数独成立规则的过程,鉴于数独的答案未必唯一,所以解题过程中要参杂随机因素,以期获取到一个随机的解。获取所有解可能是比较危险的,因为数独的解可能异常众多,解题无法停止。

        如果数独题目为空数独,即所有的格子都未知,此时的求解过程即等同于数独的随机生成。数独的生成和求解可使用同一套算法。

        数独求解(生成同)的一般思路如下:

        1、获取到所有已知格子的值,设所有未知格子的可能值为1-9。如果数独中所有格子的值都已确定,那么可直接退出解题过程。

        2、选定第一个未知格子,根据它所在的行、列、宫中已存在的确定值,从此格子的可能值列表中排除。排除后,此格子中的可能值范围可能比1-9要小,如果经排除后,可能值列表为空,说明此处无值可选,则推出结论:数独无解,退出解题过程;如果经排除后,可能值列表中仅剩下一个值,则此处可解,此格子内的值标记为为确定值。

        3、重复第2步,直到处理完所有未知格子,是为一轮。

        4、重复进行多轮,直到某一轮中无法确定任何唯一值,进行下一步。如果一轮中无法确定任何唯一值,那么说明再进行多轮也没有用处了。

        5、判断数独是否已解决,即所有格子的值都已确定。如已解决,则退出解题过程。

        6、此时通过行、列、宫的数据排除已无法再确定新值,需要进入猜测阶段。

        7、随机选取一个未知格子来进行猜测。考虑到执行效率,可以在可能值最少的一批格子中随机选取。

        8、将此格子中的可能值打乱顺序,依次尝试。任何一次尝试如果成功解题的话,则整个解题成功;如果所有尝试都未能成功解题,说明此格子无值可选,解题失败。

        9、依次尝试的过程即将此格子的值定为猜测值,重复(递归)以上所有过程以求解。

        这样,就基于最简单的解题法则(排除法)实现了任意数独的解题思路。

        我也玩过几次数独游戏,遇到较难求解的数独时都会因坚持不住而放弃,所以对数独的求解算不上精通,因此也不知晓一些“高级规则”,即通过一些特征直接判断出某未知格子确定值的规则。在此思路中,自然也没有体现出高级法则。如果有这种法则的话,可以在第2步中加入,这样可有效减少递归层次和运算次数。

        按照此思路实现了一个demo,可在此下载:http://download.csdn.net/detail/my3439955/5586225。

你可能感兴趣的:(C++,算法,数独,算法,递归)