Especificar cualquier cuadrícula arbitraria de 9x9 requiere dar la posición y el valor de cada cuadrado. Una codificación ingenua para esto podría dar 81 tripletes (x, y, valor), que requieren 4 bits para cada x, y, y valor (1-9 = 9 valores = 4 bits) para un total de 81x4x3 = 972 bits. Al numerar cada cuadrado, se puede reducir la información posicional a 7 bits, dejando caer un bit por cada cuadrado y un total de 891 bits. Al especificar un orden predeterminado, se puede reducir esto más drásticamente a solo 4 bits para cada valor para un total de 324 bits. Sin embargo, un sudoku puede tener números faltantes. Esto proporciona el potencial para reducir el número de números que deben especificarse, pero puede requerir bits adicionales para indicar posiciones. Usando nuestra codificación de 11 bits de (posición, valor), podemos especificar un rompecabezas con pistas con 11 bits, por ejemplo, un rompecabezas mínimo (17) requiere 187 bits. La mejor codificación que he pensado hasta ahora es usar un bit para cada espacio para indicar si está lleno y, de ser así, los siguientes 4 bits codifican el número. Esto requiere 81 + 4 n bits, 149 para un rompecabezas mínimo ( n = 17 ). ¿Existe una codificación más eficiente, preferiblemente sin una base de datos de cada configuración de sudoku válida? (Puntos de bonificación por abordar un n generaldelrompecabezas N × N )
Se me ocurrió que muchos acertijos serán una rotación de otro, o tendrán una simple permutación de dígitos. Quizás eso podría ayudar a reducir los bits necesarios.
De acuerdo con Wikipedia ,
El número de rejillas de solución Sudoku 9 × 9 clásicas es 6.670.903.752.021.072.936.960 (secuencia A107739 en OEIS), o aproximadamente .
Si hice mis cálculos correctamente ( ), que sale a 73 (72.498) bits de información para una tabla de búsqueda.
Pero:
Se demostró que el número de soluciones esencialmente diferentes, cuando se tienen en cuenta simetrías como la rotación, la reflexión, la permutación y el reencadenamiento, era solo de 5.472.730.538 [15] (secuencia A109741 en OEIS).
Eso da 33 (32.35) bits, por lo que es posible que un método inteligente para indicar qué permutación usar pueda llegar a estar por debajo de los 73 bits completos.
Respuestas:
Si. Puedo pensar en una codificación que mejore su codificación de 149 bits de un rompecabezas mínimo de en 6 o 9 bits, dependiendo de una condición. Esto es sin una base de datos o cualquier registro de otras soluciones o tableros parciales. Aquí va:9×9
Primero, usa bits para codificar un número m con un número mínimo de apariciones en el tablero. Los siguientes 4 bits codifican el número real ℓ de veces que aparece m . Los próximos 7 l bits de codificar cada una de las posiciones en las que m aparece.4 m 4 ℓ m 7ℓ m
Los siguientes bits son banderas que indican si las restantes posiciones tienen un número o no (que acaba de omitir las posiciones en que m es). Siempre que uno de estos bits sea , los siguientes 3 bits indican qué número es (en el conjunto ordenado { 1 , ... , 9 } sin m ). Por ejemplo, si m = 4 y los 3 bits son , entonces el número en la posición correspondiente en el tablero es el quinto (contando desde 0) en el conjunto { 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
, entonces es 6 . Los números j < m se codificarán en binario como j - 1 , mientras que los números j > m se codificarán como j - 2 . Como ya habíamos escritoposiciones ℓ , solose agregarán 3 ( n - ℓ ) bits para codificar el resto del tablero en este paso.Por lo tanto, el número total de bits necesarios para codificar una placa utilizando este procedimiento es
Para , notamos que ℓ puede ser 0 o 1 (en general, ℓ ≤ ⌊ n / 9 ⌋ ). Por lo tanto, B puede ser 140 o 143 dependiendo de si hay un número que no aparece en el tablero.n=17 ℓ ℓ≤⌊n/9⌋ B
0111
0001
0100100
011100010100100
0
1
0
1
0000000100101100
110
111
La codificación completa es
01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000
, y el lector puede verificar que la longitud de esa cadena es de hecho 143 :-)fuente