数独分析

数独这种游戏,我在很久之前就接触过了,也做过不少的题,对于以人的思维解数独,我是非常熟悉的。当然,我做的题也不是多难的,一般都是30多格的,中等难度,且不需要Brute Force(也就是猜测)的题目。

一般按人的思维,常用的方法有三个:1.摒除法,2.唯余法,3.强弱链。

摒除法就是通过哪些格子不能填这个数从而得到一个唯一的这个数的填法;唯余法就是通过分析这个格子不能填什么数而得到这个格子的唯一填法;强弱链则是通过分析数字与数字之间的逻辑关系而得到答案。

当然,对于计算机而言,猜测法才是最为实用的,DFS递归暴力破解。

在此之前,我只是做过数独,却从来没有对数独进行过研究。在这次需要写关于数独的算法,所以我又去仔细研究了数独,对数独有了一些新的了解。

1.数独的终盘个数

数独的终盘到底有多少个呢?在网上查到的准确数字为6670903752021072936960,6.67乘以10的21次方。我最初只知道这个数字,却不知道它是怎么得出的,为了研究它,我对它进行了因数分解,看看能否得到什么有趣的规律。最后,得到了一个奇怪的答案:6670903752021072936960=2^20*3^8*5*7*27704267971。在分解了半天之后分解不出任何因子之后,我决定用电脑验证。我从1验证到了1亿,依然没有发现任何因子。这个结论告诉我,这个2.77e10的数是个质数!这是什么原因?最后我找到了当初得到数独终盘数的Stanley E. Bammel和Jerome Rothstein这两位数学家的网站,网址如下点击打开链接,才得到了最后的答案。数独的终盘个数不像魔方一样,可以通过计算算出来,数独的终盘个数最终是由计算机枚举而得到的!它最终是由各个情况的组合数相加而得到,所以才可能出现那样一个庞大的质数因子。所以数独终盘有什么数学上的规则么?好像没有。

2.由一个独立解所能生成的终盘数

对于每个独立的数独终盘,都有
(1).调换数字(9!=362880)
(2).旋转棋盘(4)
(3).调换棋盘,在每三行(或列)中交换顺序(6^4=1296)
(1):所谓的调换数字,就是说数独中每个数字都是完全等价的,将1与2调换,或者1换为2,2换为3,3换为1都不会破坏该终盘。所以,通过数字调换,第一个数有9种,第二个数有8种,第三个有7种,...,最终共有9!=362880种调换方法。这些终盘之间显然是两两不同的。
(2):这个需要联系第一个调换数字一起理解。因为所有数字都是等价的,所以我们可以选择将左上角的九宫格内换为123456789顺序排列(在Stanley E. Bammel和Jerome Rothstein枚举终盘数时就是用了这样的方法锁棋盘,保证数调换不重复)。这时候,排除了第一种的干扰之后,我们就能得到,将基准选在4个角的情况是不同的,它们之间互相干扰,不会同存。所以也就是说,通过旋转棋盘,可以得到4种不同的解。
(3):首先,我们发现,在1~3,4~6,7~9,行之内互相调换,是不会破坏终盘的,我称之为调换棋盘。但是不能随意调换,如果我们将基准锁定在左上角,我们会发现,换前三行或前三列时会与(1)的调换数字有冲突(将行调换视作将上下三个数互换,这将与另一组数调换的情况完全一样)。所以左上角的锁定是不能改变的。这样,只有4~6行,7~9行,4~6列,7~9列可以换,一共6^4=1296种情况。
所以最后一共有9!*4*6^4=1881169920种交换方法,大约18.8亿。用这种方法显然是可以完成100w的题目要求的,即使不用(2)和(3)的手法,仅排列组合调换数字,再加上提前存3个不同的终盘,这样即可生成1088640种>100万的终盘。同时,这样的速度也将是最快的,按顺序打表输出即可,不需要任何计算,完全不用考虑所生成终盘的合理性。但是这样丧失了出题的随机性,每个终盘的相对位置都是一样的。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页