一、数独的介绍
从2004年底开始,数独游戏在英国变得非常流行。数独(Sudoku)是一个日语单词意思是数字位置之类的单词(或短语)。谜题的理念非常简单;面对一个9 × 9的网格,被分成9个3 × 3的块:
在其中的一些盒子里,设置者放一些数字1-9:求解者的目的是通过在每个盒子里填一个数字来完成网格,这样每一行,每一列,每个3 × 3的盒子都只包含1-9的每个数字一次。
在这里,我们讨论枚举所有可能的数独网格的问题。这是一个非常自然的问题,但是,也许令人惊讶的是,这个问题似乎不太可能有一个简单的组合答案。事实上,数独网格只是拉丁方格的特殊情况,拉丁方格的枚举本身就是一个难题,没有已知的一般组合公式。已知9 × 9的拉丁平方数为5524751496156892842531225600 ≈ 5.525 × 10^27。由于这个答案是巨大的,我们需要大大改进我们的搜索,以便能够在合理的计算时间内得到答案。
1、初步观察
我们的目标是计算有效数独网格的数量。在下面的讨论中,我们将把这些块称为B1-B9,它们被标记在这里:
首先注意,在重新标记之后,我们可以假设左上角的块(B1)是由:
对于任意一个合法数独,我都可以通过1-9数字的一对一映射,将B1块转化为这种标准形式,例如:
转化为
按照:4→1、5→2、8→3、1→4、7→5、9→6、2→7、3→8、6→9即可得到这种标准形式
这种重新标记过程将网格的数量减少了9! = 362880倍。我们被简化为计算左上角是这种标准形式的非数独网格的数量。
从广义上讲,我们的策略是考虑所有可能的方法来填充块B2, B3,因为B1是上面的规范形式,将问题减少到较小的搜索空间。这形成我们强力搜索的外环。对于内部循环,我们找出所有可能的方法来完成块B2和B3转换为全网格。
2、B2块和B3块
在这里,我们尝试有效地对B2块和B3块的可能性进行分类。我们将对如何找到一个相对较小的B2块和B3块列表进行长时间的讨论,这将使我们能够给出最终答案。(其中一些缩减也可以应用于B4和B7块,以加快搜索速度,尽管一旦B2/B3固定,许多缩减步骤不能以同样的方式在B4/B7上执行)。
2.1、最上面一排积木
我们想要列出前三个块的所有可能配置,假设第一个块是标准形式。我们来看看第二个块的最上面一行。它要么由(以某种顺序)B1块的第2行或第3行的三个数字组成&#