스도쿠 퍼즐의 효율적인 인코딩


16

임의의 9x9 격자를 지정하려면 각 사각형의 위치와 값을 지정해야합니다. 이를위한 순진한 인코딩은 81 (x, y, 값)의 트리플렛을 제공 할 수 있으며, 각각의 x, y에 대해 4 비트가 필요하고 총 81x4x3 = 972 비트에 대해 값 (1-9 = 9 값 = 4 비트)이 필요합니다. 각 사각형의 번호를 매기면 위치 정보를 7 비트로 줄이고 각 사각형의 비트와 총 891 비트를 떨어 뜨릴 수 있습니다. 미리 정해진 순서를 지정함으로써, 총 324 비트 동안 각각의 값에 대해 단지 4 비트로 이것을 크게 줄일 수있다. 그러나 스도쿠에는 숫자가 누락 될 수 있습니다. 이를 통해 지정해야하는 수를 줄일 수 있지만 위치를 표시하기 위해 추가 비트가 필요할 수 있습니다. (위치 값) 우리의 11 비트 인코딩을 사용하여, 우리는와 퍼즐을 지정할 수 과 단서 11n 비트, 예를 들어 최소 (17) 퍼즐은 187 비트를 요구한다. 지금까지 내가 생각한 최고의 인코딩은 각 공간에 1 비트를 사용하여 공간이 채워 졌는지 여부를 표시하고, 그렇다면 4 비트가 숫자를 인코딩하는 것입니다. 최소 퍼즐 ( n = 17 )에는 81 + 4 n 비트, 149가 필요합니다. 각각의 유효한 스도쿠 설정 데이터베이스가없는보다 효율적인 인코딩이 있습니까? ( N × N 퍼즐에서일반 n 을 다루는 보너스 포인트)11n81+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

스도쿠 퍼즐이 몇 개나 있는지 기억할 수 있습니까? 그래서 쉽게 해독 할 수있는 인코딩과 무차별 열거 사이의 간격이 얼마나 넓은 지 알고 있습니까?
Gilles 'SO- 악의를 멈춰라'

6.67×1021

9!

답변:


5

각각의 유효한 스도쿠 설정 데이터베이스가없는보다 효율적인 인코딩이 있습니까?

9×9

4m4m7m

81m1{1,,9}mm=4101{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


n=17

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

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

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

m=70111=10001m360100100011100010100100

0110140000000100101100m=71101,2,3,4,5,6,8,9111

// 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

완전한 인코딩은입니다 01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000. 독자는 해당 문자열의 길이가 실제로 143인지 확인할 수 있습니다 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.