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

/*
数独知多少
如图是一个已经完成的数独,图中每一行,每一列和九个3*3的小矩阵都没有重复的数字出现。
下图是另一个填好的数独。

问题:
一共有多少种不同的数独解答呢?其中有多少种是独立的解答呢?
如果我们要用一个简单的字符串来表示各种数独,例如"125864...685219",如何保证一一对应的基础上,让字符串的长度最短?

独立的解答到底是什么?如何定义独立这种关系。
如果任意交换数独的两个数字,仍然是一个合法的数独。
定义:如果两个数独的解答可以通过交换任意两个数字,而仍然是合法数独,那么他们就不是独立的。
每个数独解答都可以通过上述转化,而转化为标准型:
1 2 3
4 5 6
7 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字节。
完整版:
[1	2	3	][4	 5	6	][7	 8	9	]
[4	5	6	][7	 8	9	][1	 2	3	]
[7	8	9	][1	 2	3	][4	 5	6	]
[2	3	4	][5	 6	7	][8	 9	1	]
[5	6	7	][8	 9	1	][2	 3	4	]
[8	9	1	][2	 3	4	][5	 6	7	]
[3	4	5	][6	 7	8	][9	 1	2	]
[6	7	8	][9	 1	2	][2	 4	5   ]
[9	1	2	][3	 4	5	][6	 7	8	]

存储的是:
12345678
45678912
78912345
...
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值