Menentukan sewenang-wenang grid 9x9 memerlukan memberikan posisi dan nilai setiap persegi. Sebuah encoding naif untuk ini mungkin memberikan 81 (x, y, nilai) kembar tiga, membutuhkan 4 bit untuk setiap x, y, dan nilai (1-9 = 9 nilai = 4 bit) untuk total 81x4x3 = 972 bit. Dengan penomoran masing-masing persegi, salah satu dapat mengurangi informasi posisi ke 7 bit, menjatuhkan sedikit untuk setiap persegi dan total 891 bit. Dengan menentukan urutan yang telah ditentukan, salah satu dapat mengurangi ini lebih drastis untuk hanya 4 bit untuk setiap nilai untuk total 324 bit. Namun, sudoku dapat memiliki nomor yang hilang. Hal ini memberikan potensi untuk mengurangi jumlah angka yang harus ditentukan, tetapi mungkin memerlukan bit tambahan untuk menunjukkan posisi. Menggunakan encoding 11-bit kami (posisi, nilai), kita dapat menentukan puzzle dengan petunjuk dengan 11 bit, misalnya puzzle (17) minimal membutuhkan 187 bit. Pengkodean terbaik yang saya pikirkan sejauh ini adalah menggunakan satu bit untuk setiap ruang untuk menunjukkan apakah itu terisi dan, jika demikian, 4 bit berikut ini mengkodekan angka tersebut. Hal ini memerlukan 81 + 4 n bit, 149 untuk puzzle minimal ( n = 17 ). Apakah ada pengkodean yang lebih efisien, lebih disukai tanpa database dari setiap pengaturan sudoku yang valid? (Poin bonus untuk mengatasi n umumdari N × N puzzle)
Itu hanya terjadi kepada saya bahwa banyak teka-teki akan menjadi rotasi lain, atau memiliki permutasi sederhana digit. Mungkin itu bisa membantu mengurangi bit yang diperlukan.
Menurut Wikipedia ,
Jumlah klasik 9 × 9 Sudoku solusi grid adalah 6,670,903,752,021,072,936,960 (urutan A107739 di Oei), atau sekitar .
Jika saya melakukan matematika saya tepat ( ), yang keluar untuk 73 (72,498) bit informasi untuk tabel lookup.
Tapi:
Jumlah dasarnya solusi yang berbeda, ketika simetri seperti rotasi, refleksi, permutasi dan penandaan ulang diperhitungkan, terbukti hanya 5472730538 [15] (urutan A109741 di Oei).
Itu menghasilkan 33 (32,35) bit, jadi ada kemungkinan bahwa metode yang cerdik untuk menunjukkan permutasi yang digunakan bisa sampai di bawah 73 bit penuh.
Jawaban:
Iya. Saya dapat memikirkan suatu pengkodean yang meningkatkan pengodean 149-bit Anda dari sebuah puzzle 9 × minimal dalam 6 atau 9 bit, tergantung pada suatu kondisi. Ini adalah tanpa database atau register solusi lain atau papan parsial. Ini dia:9×9
Pertama, Anda menggunakan bit untuk mengkodekan sejumlah m dengan jumlah minimal penampilan di papan. Berikutnya 4 bit mengkodekan jumlah sebenarnya ℓ kali m muncul. Berikutnya 7 ℓ bit mengkodekan setiap posisi di mana m muncul.4 m 4 ℓ m 7ℓ m
Berikut ini bit bendera yang menunjukkan apakah sisa posisi memiliki nomor atau tidak (Anda hanya melewatkan posisi di mana m adalah). Setiap kali salah satu bit ini adalah , maka selanjutnya 3 bit menunjukkan yang nomor itu (di set memerintahkan { 1 , ... , 9 } tanpa m ). Misalnya, jika m = 4 dan 3 bit adalah , maka angka dalam posisi yang sesuai di papan adalah yang ke 5 (dihitung dari 0) di set { 1 , 2 , 3 ,81−ℓ m {1,…,9} m m=4 {1,2,3,5,6,7,8,9} 6 j<m j−1 j>m j−2 ℓ 3(n−ℓ)
1
101
, jadi itu adalah 6 . Angka j < m akan dikodekan dalam biner sebagai j - 1 , sedangkan angka j > m akan dikodekan sebagai j - 2 . Karena kita telah menulisposisi ℓ , hanya 3 ( n - ℓ ) bit yang akan ditambahkan untuk menyandikan bagian papan yang lain pada langkah ini.Dengan demikian, jumlah total bit yang diperlukan untuk mengkodekan papan menggunakan prosedur ini adalah
Untuk , kami mencatat bahwa ℓ dapat 0 atau 1 (secara umum, ℓ ≤ ⌊ n / 9 ⌋ ). Dengan demikian, B dapat 140 atau 143 tergantung pada apakah ada nomor tidak muncul di papan.n=17 ℓ ℓ≤⌊n/9⌋ B
Patut ditunjukkan bahwa solusi Kevin jauh lebih baik dalam kasus umum. Ini pengkodean menggunakan paling 149 bit hanya untuk , atau untuk n = 20 asalkan ℓ = 0 . Setidaknya itu menunjukkan gambaran umum tentang bagaimana untuk mengambil keuntungan dari fakta bahwa N = 9 sangat dekat dengan 2 ⌊ log 2 N ⌋ (yang berarti kita cenderung untuk "memory lose" dengan menggunakan 4 bit per nilai, sejak 4 bit memungkinkan kita untuk mengekspresikan N = 16 angka juga.n∈{17,18,19} n=20 ℓ=0 N=9 2⌊log2N⌋ N=16
Contoh. Pertimbangkan papan berikut dengan petunjuk.n=17
Di sini, tidak ada nomor tidak muncul di papan tulis, dan angka 6, 7 dan 9 hanya muncul sekali. Kami mengambil ( ) dan ℓ = 1 ( ). Membaca posisi dari kiri ke kanan dan kemudian dari atas ke bawah, m muncul di posisi 36 ( ). Dengan demikian, encoding kami dimulai dengan .m=7 ℓ=1 m 36
0111
0001
0100100
011100010100100
0
1
0
1
0000000100101100
110
111
Pengkodean lengkap adalah
01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000
, dan pembaca dapat memeriksa panjang string itu memang 143 :-)sumber