数独パズルの効率的なエンコード


16

任意の9x9グリッドを指定するには、各正方形の位置と値を指定する必要があります。この単純なエンコーディングでは、81(x、y、value)トリプレットが得られ、x、y、および値ごとに4ビット(1-9 = 9値= 4ビット)が必要で、合計81x4x3 = 972ビットです。各正方形に番号を付けることにより、位置情報を7ビットに減らし、各正方形のビットと合計891ビットをドロップできます。所定の順序を指定することにより、合計324ビットの各値に対して、これを大幅に4ビットに減らすことができます。ただし、数独には数字が欠けている場合があります。これにより、指定する必要のある数字の数を減らすことができますが、位置を示すために追加のビットが必要になる場合があります。(位置、値)の11ビットエンコードを使用して、手がかりを持つパズルを指定できます。n11nビット、例えば最小(17)パズルには187ビットが必要です。私がこれまで考えた中で最良のエンコードは、各スペースに1ビットを使用して、それが満たされているかどうかを示し、そうであれば、次の4ビットが数値をエンコードすることです。これにはビットが必要で、最小パズルの場合は149()です。できれば有効な各数独セットアップのデータベースなしで、より効率的なエンコードがありますか?(パズルから一般的なに対処するためのボーナスポイント)81+4nn=17nN×N

多くのパズルは別のパズルを回転させたり、数字の単純な並べ替えをしたりするということを思いつきました。おそらくそれは必要なビットを減らすのに役立つ可能性があります。

ウィキペディアによると、

古典的な9×9数独ソリューショングリッドの数は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

数独パズルがいくつあるのか思い出せますか?だから、これらの簡単に解読可能なエンコードとブルートフォースの列挙とのギャップがどれほど広いかを知っていますか?
ジル「SO-悪であるのをやめる」

すべてのグリッドをエンコードできる必要があるため、73ビットが必要です(固定長エンコードを想定)。「どの順列を使用するかを示す巧妙な方法」はそれを助けません。6.67×1021
-svick

@sick情報理論の観点からは、あなたは正しいに違いないと思いますが、余分なビットがどこから来ているのかわかりません。あります順列は19ビットで、ミラーと回転に3を加えたものなので、22にユニークなパズルに33を加えたものは55になります。他の18はどこから来たのですか?9!
ケビン

回答:


5

できれば有効な各数独セットアップのデータベースなしで、より効率的なエンコードがありますか?

はい。条件に応じて、6ビットまたは9ビットの最小パズルの149ビットエンコーディングを改善するエンコーディングを考えることができます。これはあるなしで、データベースまたは他の溶液または部分基板の任意のレジスタ。ここにあります:9×9

最初に、ビットを使用して、ボードに表示される最小数のをエンコードします。次のビットは、が現れる実際の回数をエンコードします。次のビットは、が現れる各位置をエンコードします。4m4m7m

次のビットは、残りの位置に数字があるかどうかを示すフラグです(の位置をスキップするだけです)。これらのビットの1つがであるときはいつでも、次の3ビットはそれがどの番号であるかを示します(順序付けられた集合でなし)。たとえば、で3ビットがの場合、ボード上の対応する位置の数は、セットの5番目(0からカウント)です。なので、です。数字はバイナリでとしてエンコードされますが、数字81m1{1,,9}mm=4101{1,2,3,5,6,7,8,9}6j<mj1j>mとしてエンコードされます。すでに位置を記述しているため、このステップではボードの残りの部分をエンコードするためにビットのみが追加されます。j23(n)

したがって、この手順を使用してボードをエンコードするために必要なビットの総数は、

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

以下のために、我々は注意 0または1(一般的には、とすることができる)。したがって、ボードに数字が表示されていないかどうかに応じて、は140または143になります。n=17n/9B

一般的なケースでは、ケビンのソリューションがはるかに優れていることを指摘する価値があります。この符号化だけのために最も149ビットでの使用、またはのためものとする。少なくとも、がに非常に近いという事実を利用する方法の一般的なアイデアを示しています(つまり、値ごとに4ビットを使用することで「メモリを失う」傾向があります。 4ビットにより、数値も表現できるためです。N = 20 = 0 N = 9 2 ログイン2 N N = 16n{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   .  .  .

ここでは、ボードに数字表示され、数字6、7、9は1回だけ表示されます。()および()を取ります。位置を左から右へ、そして上から下へ読むと、は位置()に表示されます。したがって、エンコードはで始まります。= 1 M 36m=70111=10001m360100100011100010100100

次に、7が必要です0。1 1と数値の3ビットエンコーディングが必要で、その後にa と 3ビットエンコーディングが続きます()。最終的に、位置をスキップし、8を(リスト 0からカウントする6番目の数)としてエンコードし、9を。完全なエンコードは次のとおりです。4 m個= 7 1 2 3 4 5 6 8 910140000000100101100m=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.