できれば有効な各数独セットアップのデータベースなしで、より効率的なエンコードがありますか?
はい。条件に応じて、6ビットまたは9ビットの最小パズルの149ビットエンコーディングを改善するエンコーディングを考えることができます。これはあるなしで、データベースまたは他の溶液または部分基板の任意のレジスタ。ここにあります:9×9
最初に、ビットを使用して、ボードに表示される最小数のをエンコードします。次のビットは、が現れる実際の回数をエンコードします。次のビットは、が現れる各位置をエンコードします。4m4ℓm7ℓm
次のビットは、残りの位置に数字があるかどうかを示すフラグです(の位置をスキップするだけです)。これらのビットの1つがであるときはいつでも、次の3ビットはそれがどの番号であるかを示します(順序付けられた集合でなし)。たとえば、で3ビットがの場合、ボード上の対応する位置の数は、セットの5番目(0からカウント)です。なので、です。数字はバイナリでとしてエンコードされますが、数字81−ℓm1
{1,…,9}mm=4101
{1,2,3,5,6,7,8,9}6j<mj−1j>mとしてエンコードされます。すでに位置を記述しているため、このステップではボードの残りの部分をエンコードするためにビットのみが追加されます。j−2ℓ3(n−ℓ)
したがって、この手順を使用してボードをエンコードするために必要なビットの総数は、
B=4+4+7ℓ+(81−ℓ)+3(n−ℓ)=89+3ℓ+3n.
以下のために、我々は注意 0または1(一般的には、とすることができる)。したがって、ボードに数字が表示されていないかどうかに応じて、は140または143になります。n=17ℓℓ≤⌊n/9⌋B
一般的なケースでは、ケビンのソリューションがはるかに優れていることを指摘する価値があります。この符号化だけのために最も149ビットでの使用、またはのためものとする。少なくとも、がに非常に近いという事実を利用する方法の一般的なアイデアを示しています(つまり、値ごとに4ビットを使用することで「メモリを失う」傾向があります。 4ビットにより、数値も表現できるためです。N = 20 ℓ = 0 N = 9 2 ⌊ ログイン2 N ⌋ N = 16n∈{17,18,19}n=20ℓ=0N=92⌊log2N⌋N=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
ℓ=10001
m360100100
011100010100100
次に、7が必要です0
。1 1
と数値の3ビットエンコーディングが必要で、その後にa と 3ビットエンコーディングが続きます()。最終的に、位置をスキップし、8を(リスト 0からカウントする6番目の数)としてエンコードし、9を。完全なエンコードは次のとおりです。4 m個= 7 1 、2 、3 、4 、5 、6 、8 、910
1
40000000100101100
m=7110
1,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であることを確認できます:-)