数独拼图的有效编码


16

指定任意9x9网格要求提供每个正方形的位置和值。单纯的编码可能会产生81个(x,y,值)三元组,每个x,y和值需要4位(1-9 = 9个值= 4位),总计81x4x3 = 972位。通过对每个方块编号,可以将位置信息减少到7位,每个方块减少1位,总共减少891位。通过指定一个预定的顺序,可以将这个顺序更彻底地减少到每个值只有4位,总共324位。但是,数独可能缺少数字。这为减少必须指定的数量提供了可能,但可能需要额外的位来指示位置。使用我们的(位置,值)的11位编码,我们可以指定线索的拼图n11n位,例如最小(17)拼图需要187位。到目前为止,我想到的最好的编码是对每个空格使用一位,以指示是否已填充,如果是,则接下来的4位对数字进行编码。这需要位,最小拼图需要149位()。是否有更有效的编码,最好没有每个有效数独设置的数据库?(用于解决一般的奖励积分从拼图)Ñ = 17 Ñ Ñ × Ñ81+4nn=17nN×N

在我看来,许多难题将是另一个难题的旋转,或者是简单的数字排列。也许可以帮助减少所需的位数。

根据维基百科

经典9×9 Sudoku解决方案网格的数量为6,670,903,752,021,072,936,960(OEIS中的序列A107739),或大约为6.67×1021

如果我做了我的数学权(),得出查询表的73(72.498)位信息。ln(6,670,903,752,021,072,936,960)ln(2)

但:

当考虑到诸如旋转,反射,置换和重新标记之类的对称性时,本质上不同的解决方案的数量仅为5,472,730,538 [15](OEIS中的序列A109741)。

这给出了33(32.35)位,因此指示使用哪种排列的巧妙方法可能会低于全部73位。


1
哈,我最初发布了一些内容,却没有足够认真地思考问题。我已经删除了。好问题!
Patrick87 2012年

您能提醒我们多少个Sudoku谜题,所以我们知道这些易于解码的编码和强力枚举之间的差距有多大吗?
吉尔斯(Gillles)“所以-别再邪恶了”

您需要能够对所有网格进行编码,因此需要73位(假设固定长度编码)。没有任何“使用哪个排列的聪明方法”可以帮助您。6.67×1021
svick 2012年

@sick从信息论的角度来看,我认为您一定是正确的,但是我无法弄清楚多余的数据来自何处。有排列是19位,加上3表示镜像和旋转,因此22加上33表示独特的拼图,得出55;其他18个来自哪里?9!
凯文

Answers:


5

是否有更有效的编码,最好没有每个有效数独设置的数据库?

是。我可以想到一种编码,根据条件的不同,可以改进您的149位编码,以6或9位最小拼图。这没有数据库或任何其他解决方案或部分板的注册。它去了:9×9

首先,您使用位对数字m进行编码,使面板中的出现次数最少。接下来的4位编码的实际数量中号出现。接下来的7个比特编码每个中的位置的出现。4m4m7m

以下位是标志,指示其余位置是否有数字(您只需跳过m所在的位置)。每当这些位之一为时,接下来的3位将指示其为哪个数字(在无m的有序集合{ 1 9 }中)。例如,如果= 4和3位,然后在所述板上的相应位置的数量是在该组中的第5次(从0计数){ 1 2 3 81m1{1,,9}mm=4101,因此它是 6。数字 j < m将被二进制编码为 j - 1,而数字 j > m将被编码为 j - 2。由于我们已经写入了 ℓ个位置,因此在此步骤中,将仅添加 3 n - 位来编码电路板的其余部分。{1,2,3,5,6,7,8,9}6j<mj1j>mj23(n)

B=4+4+7+(81)+3(n)=89+3+3n.

n=17n/9B

n{17,18,19}n=20=0N=92log2NN=16


Example. Consider the following board with n=17 clues.

.  .  .   .  .  .   .  1  .
4  .  .   .  .  .   .  .  .
.  2  .   .  .  .   .  .  .

.  .  .   .  5  .   4  .  7
.  .  8   .  .  .   3  .  .
.  .  1   .  9  .   .  .  .

3  .  .   4  .  .   2  .  .
.  5  .   1  .  .   .  .  .
.  .  .   8  .  6   .  .  .

Here, no number does not appear on the board, and numbers 6, 7 and 9 appear only once. We take m=7 (0111) and =1 (0001). Reading the positions from left to right and then from top to bottom, m appears in the position 36 (0100100). Thus, our encoding begins with 011100010100100.

Next, we need seven 0s, one 1 and the 3-bit encoding of the number 1, then a 0 followed by a 1 and the 3-bit encoding of 4, etc. (0000000100101100). Eventually, we will skip the position where m=7 is, and we will encode 8 as 110 (the 6th number counting from 0 on the list 1,2,3,4,5,6,8,9) and 9 as 111. The full encoding goes as follows:

// m=7, l=1 and its position on the board.
011100010100100
// Numbers 1 and 4 at the beginning. Note that 1 is encoded 000, and 4 is 011.
0000000100001011
// Numbers 2 and 5.
0000000001001000000000001100
// Numbers 4 and 8. We skip the appearance of 7 and encode 8 as 110.
010110001110
// 3, 1 and 9. 9 is encoded as 111.
00010100000100001111
// 3, 4, 2, 5, 1, 8, 6 and the last empty cells.
0000101000101100100100011000100000000000111001101000

The complete encoding is 01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000, and the reader can check the length of that string is indeed 143 :-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.