Editar disponibles

Figura
Figura. Mejora editar disponibles

Ya hace bastante tiempo que publiqué la aplicación SUDOKU y ahora, a petición de un usuario, voy a implementar algunas mejoras. Una de ellas es la edición de disponibles como se observa en la Figura, que permitirá la edición manual de los disponibles pues antes sólo era posible usando el botón de pistas.

Vemos en la Figura que en la quinta fila hay una pareja de solitarios (naked pair) formado por la pareja '48' en la séptima y novena columna de esa fila, por lo que el resto de apariciones de esos números '4' y '8' en los disponibles de otras celdas de esa fila pueden eliminarse. Ahora vemos en la parte superior derecha el campo editar disponibles que nos permite borrar manualmente el '8' de los disponibles '2378' en la tercera celda de esa fila.

Figura
Figura. Pista pareja solitarios '48' (Naked pair)

Hasta ahora esa eliminación de disponibles podía hacerse usando pistas como se observa en la Figura, pero no es apropiado si se trata de usar la aplicación sin pistas.

Recuerde que en estos temas informativos el botón en el pie de imagen de la Figura permite copiar el tablero del ejemplo de la imagen para importarlo en la aplicación.

El botón ya existente permite abrir el panel de pistas. Y ahora agrego el nuevo botón para cerrar ese panel. Otro nuevo botón nos pemitirá comprobar si el Sudoku tiene solución única sin mostrar esa solución, como explicaremos en un siguiente apartado.

Figura
Figura. Control al editar disponibles

Los disponibles se construyen automáticamente al inicio y tras cada inserción o eliminación de un número en el tablero. Ahora podemos agregar o eliminar números a los disponibles de una celda siempre y cuando sean correctos. Por ejemplo, en la Figura vemos que intentamos añadir el número '5' a los diponibles '37' de la primera celda de la quinta fila, pero eso no es posible pues ya el número '5' está fijado en la segunda celda de esa fila, con lo que la aplicación lo impide y presenta un mensaje de error. Observe que haciendo click sobre el mensaje lo cerramos.

Exportar e importar con disponibles

Figura
Figura. Mejora exportar con disponibles y fecha-hora

Otra mejora es exportar el tablero con disponibles, pues antes sólo se podía exportar con los números fijados. En la Figura vemos las nuevas opciones con disponibles y con fecha y hora, con lo que se inserta la fecha y hora como un comentario, pues además todas las líneas que empiecen con el caracter "#" se considerarán comentarios.

También agrego el botón para descargar en un archivo de texto el contenido a exportar.

* * * * 5 * * 9 6
5 8 * * 6 * * 4 3
6 7 * * 3 * * 5 2
* * 4 7 8 5 * * 1
* 5 * 6 1 9 * * *
* 1 * * 4 * * 7 *
* * 5 8 2 * 3 * *
2 * * * * * * 8 *
8 * * 5 * * 2 * *

Si tras eliminar el disponible '8' del tablero de la Figura exportamos sin disponibles ni usamos fecha y hora, separando columnas con espacios y filas con saltos de línea, usando el "*" como indicador de celda vacía, obtendremos el tablero en texto como el adjunto. Ahora activando comentario de fecha-hora y disponibles, vemos que en lugar del "*" incluye la lista de disponibles de cada celda encerrándola en corchetes como con '[134]' en la primera celda.

# 05-04-2026_08:30:23
[134] [234] [123] [124] 5 [78] [78] 9 6
5 8 [129] [129] 6 [127] [17] 4 3
6 7 [19] [149] 3 [148] [18] 5 2
[39] [2369] 4 7 8 5 [69] [236] 1
[37] 5 [237] 6 1 9 [48] [23] [48]
[39] 1 [23689] [23] 4 [23] [5689] 7 [589]
[1479] [469] 5 8 2 [1467] 3 [16] [479]
2 [3469] [13679] [1349] [79] [13467] [145679] 8 [4579]
8 [3469] [13679] 5 [79] [13467] 2 [16] [479]

Esto es óptimo para exportar un tablero sin finalizar y seguir con el juego en otro momento tras importarlo, pues antes podíamos importar el tablero pero si habían disponibles eliminados esta situación no se guardaba.

Figura
Figura. Mejora importar con disponibles desde un archivo

Ahora también importamos con disponibles, pudiendo hacerlo desde un archivo usando el botón seleccionar archivo, como se observa en la Figura.

Guardar y leer tablero actual (con disponibles) o inicial

Figura
Figura. Guardar y leer tablero inicial y actual

Otra cosa mejorada es que antes con el botón guardar inicial guardábamos temporalmente el estado del tablero en un momento dado, que luego podíamos extraer inicial con el botón .

Ahora denominamos tablero actual al estado tras haber realizado modificaciones del tablero inicial. Agregamos dos nuevos botones y para guardar el tablero y sus disponibles en el momento actual del juego y leer ambos en un momento posterior y no en el estado inicial, al que seguiremos accediendo con los botones anteriores. La diferencia estriba en que en el estado inicial no se tienen en cuenta los números insertados posteriormente ni se guardan los disponibles, pues se reconstruyen automáticamente cada vez que se lea el tablero inicial.

Esas acciones así como los que permiten deshacer y rehacer nos dan la posibilidad de volver a un punto anterior del juego por si los pasos que hemos dado no nos conducen a la solución. Así en cualquier momento del juego podemos guardar el tablero y sus disponibles para volver a ese momento si fuera el caso. Mientras que siempre podemos acceder al estado inicial o guardar un estado intermedio como estado inicial.

También agregamos el nuevo botón para resolver el tablero inicial, manteniendo el botón anterior que ahora resuelve el tablero actual.

Control de celdas sin disponibles

Figura
Figura. Ejemplo Sudoku

En el ejemplo de la Figura vemos el solitario '9' en la cuarta fila y novena columna, número que debe ir ahí obligatoriamente. Si ponemos un '9' en la celda anterior de esa fila sería un error pues la siguiente quedaría sin disponibles, pero antes la aplicación no lo advertía.

Figura
Figura. Control de celdas sin disponibles

Ahora, como vemos en la Figura, nos advierte del error. Y aunque nos permitirá seguir con el juego, el mensaje seguirá saliendo hasta que se corrija, bien borrando el '9' que hemos puesto o deshaciendo acciones.

Comprobar si tiene solución única

Figura
Figura. Sudoku con 1 solución

La forma en que importamos tableros en la aplicación son las que vemos en el campo opciones del panel generar tablero que se ubica en la parte superior de la aplicación. Las opciones pueden ser un tablero vacío, una muestra, uno aleatorio, diversas transformaciones del tablero (reetiquetar, permutar, transponer, rotar, reflejar) e importar tablero.

Podemos crear un nuevo tablero de forma manual con la opción vacío e ir rellenando manualmente los números iniciales y al final usar el botón guardar inicial que podemos ver al pie de la Figura para guardarlo como tablero inicial.

En cualquier caso un tablero inicial son un conjunto de números iniciales que no siempre pueden conducir a una solución única. Ya expusimos en el tema unicidad y rectángulos únicos que un SUDOKU es un tablero con números iniciales que conducen a una única solución. Muchas combinaciones de números iniciales pueden conducir a varias soluciones o incluso no encontrar solución.

Como ya dijimos, denominamos tablero actual al estado tras haber realizado modificaciones del tablero inicial. Con el nuevo botón podemos verificar que el tablero actual conduce a una única solución, como vemos en la Figura. Hay que recordar que resolver el Sudoku con el botón usará el tablero inicial mientras que el botón resolverá el tablero actual.

Figura
Figura. Sudoku sin solución única

El tablero anterior tiene una única solución donde en la última celda [9,9] va necesariamente un '4'. Supongamos que empezamos a rellenar el tablero poniendo ahí un '9' y luego comprobamos si tiene solución con el botón , obteniendo el mensaje de error que nos dice que ese Sudoku con ese '9' no tiene solución.

Figura
Figura. Sudoku sin solución

Si ignoramos ese error y seguimos rellenando casillas usando las pistas llegaremos a un momento como el que vemos en la Figura donde hay un único '2' en los disponibles de las celdas [1,2] y [1,4] de la misma fila, lo que conduce a un Sudoku sin solución, pues si ponemos ese '2' en una celda la otra quedará sin disponibles.

Figura
Figura. Ejecución sin profundizar (sólo con vuelta atrás)

Si guardamos como inicial el tablero de la Figura con el '9' incorrecto en la última celda y resolvemos ese tablero inicial con el botón desactivando la opción profundizar con un máximo de 10000 iteraciones, como vemos en la Figura, con lo que se ejecutará con sólo vuelta atrás, veremos que no encontró ninguna solución en 344 iteraciones, no habiendo más soluciones pues el algoritmo finalizó antes de completar el máximo de iteraciones, de lo que se deduce que ese tablero no tiene solución. Se obtiene este resultado:

Tiempo total: 9 ms
Soluciones encontradas en 344 iteraciones: 0
NO SE PUDO COMPLETAR EL SUDOKU!!!!!!!!!!!!
No hay más soluciones pues el algoritmo finalizó antes de
completar el máximo de iteraciones.

Tal como explicamos en el tema Sudoku con vuelta atrás, usar ese algoritmo encontrará siempre al menos una o más soluciones si el Sudoku tiene solución y se permiten el número suficientes de iteraciones. En cambio si finaliza antes de completar un máximo de iteraciones y no se encuentra solución se puede asegurar que no tiene solución. Así que cuando estemos completando un Sudoku puede suceder que de lugar a una única solución, a más de una solución o que no tenga solución.

Figura
Figura. Sudoku con varias soluciones

En la Figura vemos otro ejemplo de un tablero inicial que tiene solución pero no es única, por lo que no es un "verdadero Sudoku". Si ejecutamos resolver inicial con el botón obtenemos estas dos soluciones:

Solución 1:
6 3 1 9 7 8 4 2 5
7 5 9 6 4 2 8 3 1
8 2 4 1 3 5 6 9 7
4 9 3 5 1 6 2 7 8
2 6 8 3 9 7 1 5 4
5 1 7 8 2 4 9 6 3
9 7 6 4 5 1 3 8 2
3 4 5 2 8 9 7 1 6
1 8 2 7 6 3 5 4 9

Solución 2:
6 3 1 9 7 8 4 2 5
7 5 9 6 4 2 8 3 1
8 2 4 1 3 5 9 6 7
4 9 3 5 1 6 2 7 8
2 6 8 3 9 7 1 5 4
5 1 7 8 2 4 6 9 3
9 7 6 4 5 1 3 8 2
3 4 5 2 8 9 7 1 6
1 8 2 7 6 3 5 4 9
    

Nos devuelve también este texto: Soluciones encontradas en 3 iteraciones: 2. No hay más soluciones pues el algoritmo finalizó antes de completar el máximo de iteraciones.

Exportar configuración

Figura
Figura. Exportar e importar configuración

Otra mejora es exportar o importar la configuración tal como vemos en la Figura. Con el botón para exportar se genera y descarga un archivo de texto con un contenido con las opciones de la aplicación de los paneles de exportación, importación y captura de imagen así como las que aparecen en el panel de configuración de la parte inferior al que se accede con el botón .

# SUDOKU CONFIG 05-04-2026_10:21:49
tablerotext-vacio:*
tablerotext-con-disponibles:false
tablerotext-con-fechahora:false
tablerotext-splitcols:espacios
tablerotext-splitrows:n
exportarimg-tipo:png
exportarimg-anchocelda:75
exportarimg-condisponibles:false
exportarimg-conencabezados:false
maxiter:100
numsoluciones:Infinity
trazado:false
seleccion:siguiente
anchocelda:48.0
profundiza-pairs:true
profundiza-locked:true
profundiza-trios:true
profundiza-wing:true
profundiza-uniqueness:true
profundiza-fish:true
tecnicas-bloqueadas [data-nombre="Unique rectangle (II) # abc,ab;ab,abc"]:true
tecnicas-bloqueadas [data-nombre="Franken X-wing"]:true
tecnicas-bloqueadas [data-nombre="Jellyfish # row"]:false
tecnicas-bloqueadas [data-nombre="Jellyfish # col"]:false
tecnicas-bloqueadas [data-nombre="Franken Jellyfish (cover) # row"]:false
tecnicas-bloqueadas [data-nombre="Franken Jellyfish (cover) # col"]:false
tecnicas-bloqueadas [data-nombre="Franken Jellyfish (base 2 boxs) # row"]:false
tecnicas-bloqueadas [data-nombre="Franken Jellyfish (base 2 boxs) # col"]:false

En un momento posterior podemos importar esa configuración usando el botón seleccionar archivo. También podemos importar la configuración inicial con el botón importar inicial, restaurándose con la que por defecto se abre inicialmente la aplicación.

Exportar imagen del tablero

Figura
Figura. Capturar imagen del tablero

Otra mejora es poder capturar la imagen del tablero. En la Figura vemos como hacemos esta captura estableciendo un ancho de celda de 24 píxeles. Para descargar esa imagen podemos usar el botón o bien usar el menú contextual del navegador que nos permitirá guardar la imagen. Podemos exportar en tipos PNG, JPEG y WEBP.

Esto podría interesar pues si damos un ancho de celda de 75 píxeles la imagen resultante tendrá un ancho en torno a 19 cm, lo que nos permitiría imprimirlo en un papel DIN A4 para completar el Sudoku a mano con papel y lápiz y con bastante espacio en las celdas para las anotaciones. Aunque supongo que ya nadie imprime cosas en papel, en cualquier caso es una utilidad para capturar el tablero.

En 2023 publiqué el tema cómo exportar un trozo de HTML a imagen que ahora uso para esta mejora.
Figura
Figura. Imagen del tablero con disponibles y encabezados

En la Figura vemos una imagen capturada usando las opciones con disponibles y con encabezados y un ancho de celda de 36 píxeles.