编程之美:第四章 数字之趣 4.9数独知多少

来源:互联网 发布:php输出当前时间 编辑:程序博客网 时间:2024/05/19 14:36
/*数独知多少如图是一个已经完成的数独,图中每一行,每一列和九个3*3的小矩阵都没有重复的数字出现。下图是另一个填好的数独。问题:一共有多少种不同的数独解答呢?其中有多少种是独立的解答呢?如果我们要用一个简单的字符串来表示各种数独,例如"125864...685219",如何保证一一对应的基础上,让字符串的长度最短?独立的解答到底是什么?如何定义独立这种关系。如果任意交换数独的两个数字,仍然是一个合法的数独。定义:如果两个数独的解答可以通过交换任意两个数字,而仍然是合法数独,那么他们就不是独立的。每个数独解答都可以通过上述转化,而转化为标准型:1 2 34 5 67 8 9不考虑是否独立的情况下,一个空的数独有N个解答,考虑了上述的等价关系之后,独立的解答数目应该是N/(9!),因为一共有9!种放法。关于解答的总数,面试者其实是想要一个近似的答案。如果能够在短时间通过分析,把大问题分解为若干子问题,然后推导出答案的上界和下界。展示探索方法:记录数独的9个字块标记如图所示:[][][][B1][B2][B3][][][][][][][B4][B5][B6][][][][][][][B7][B8][B9][][][]称B1,B2,B3组成一个块行,如果一个解使得块行内每行每块都恰好包含1到9这9个数字,则称该解为一个块行解;  B1,B4,B7组成一个块列,                列                                                   列首先讨论有多少组"块行解"。假设B1是标准型,一旦我们能得到一个基于B1“标准型”的块行解,我们就能够通过1到9的置换得到另一个“块行解”,显然这样的置换9!个,如果机遇B1标准型的块行解有N个,总共有9!*N个。下面讨论机遇B1标准型的块行解的个数。B2和B3第一行的构成有两种可能性,有B1的第二行或第三行构成(纯粹型),或者由B1第二行第三行混合构成(混合型)。每一行中的3个元素都可以任意交换,并且B2和B3位置也可以互换,所以共有2*(3!)^6其中a,b,c表示1,2,3所在位置,a可以是1,2,3中的任何一个数,每一行中的3个元素都可以任意交换,B2和B3位置可以交换,此外B2和B3的第一行一共有如下9种可能性。因此共有9*3*2*(3!)^6种综上:总数 = 纯粹型 + 混合型 = 9!*2*(3!)^6 + 3*2*9*(3!)^6 = 948 109 639 680满足每个子块都是由1到9填充的解共有N=(9!)^9.又因为九宫格内有3个块行,满足每行每块都由1到9填充的解共有M=948 109 69 680^3种满足块行限制解在此满足块限制解中所占的比例为k = M/N,假设两个比例互相独立,则同时满足块行列限制解在满足块限制解中所占的比例为k^2,因此同时满足块行列限制的解(即九宫格的解)总数约为N*K^2 = 948 109 639 680^6/(9!)^9 ~ 6.67*10^21这个没看懂,如果现在有一个数独答案,怎么记录>最直接方法:从上到下,从左到右记录每一个数字。每个数字用一个char来存储的话需要81个字节,如果用4bit表示一个数字,需要40.5字节。我们只需要记录数独左上方:8*8方阵中的64个数字,其他17个数字必然可以从这64个数字中推出来,牛逼,这样我们还使用上述简单编码,只需要几楼呀32字节。完整版:[123][4 56][7 89][456][7 89][1 23][789][1 23][4 56][234][5 67][8 91][567][8 91][2 34][891][2 34][5 67][345][6 78][9 12][678][9 12][2 45   ][912][3 45][6 78]存储的是:123456784567891278912345...67891234还有其他方法可以进一步压缩空间,例如每一个数字(1~9)用4个位就可以表示,如果12是向量两个数字,它们可以当做整数"12"不造成歧义,两个数字才4bit。最少需要多少空间,问题的下界是多少?不考虑等价的情况下有,6.7*10^21个不同的数独,我们使用k bit空间,最多能表示2^k种不同的数独,那么我们需要的最少空间至少要:2^k >= 6.7 = 10^21,k>73,约8字节*/

0 0
原创粉丝点击