Cómo generar tablas de Sudoku con soluciones únicas


¿Cómo se genera un tablero de Sudoku con una solución única? Lo que pensé era inicializar un tablero aleatorio y luego eliminar algunos números. Pero mi pregunta es ¿cómo puedo mantener la singularidad de una solución?

Author: tskuzzy, 2011-08-03

7 answers

Fácil:

  1. Encuentre todas las soluciones con un algoritmo de backtracking eficiente.
  2. Si solo hay una solución, ya está. De lo contrario, si tiene más de una solución, encuentre una posición en la que la mayoría de las soluciones difieran. Agregue el número en esta posición.
  3. Vaya a 1.

Dudo que pueda encontrar una solución que sea mucho más rápida que esto.

 27
Author: TMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 08:55:58

Aquí está la forma en que mi propio programa de SuDoKu lo hace:


  1. Comience con un tablero completo y válido (lleno con 81 números).

  2. Haga una lista de las 81 posiciones de la celda y barajarla aleatoriamente.

  3. Mientras la lista no esté vacía, tome la siguiente posición de la lista y elimine el número de la celda relacionada.

  4. Pruebe la unicidad usando un solucionador de retroceso rápido. Mi solucionador es - en teoría-capaz de contar todas las soluciones, pero para al probar la singularidad, se detendrá inmediatamente cuando encuentre más de una solución.

  5. Si la placa actual todavía tiene una sola solución, vaya al paso 3) y repita.

  6. Si el tablero actual tiene más de una solución, deshaga la última eliminación (paso 3) y continúe el paso 3 con la siguiente posición de la lista

  7. Deténgase cuando haya probado las 81 posiciones.


Esto te da no solo tableros únicos, sino tableros donde no puedes elimine más números sin destruir la singularidad de la solución.

Por supuesto, esta es solo la segunda mitad del algoritmo. La primera mitad es encontrar un tablero válido completo primero (¡llenado aleatoriamente!) Funciona muy similar, pero"en la otra dirección":


  1. Empieza con un tablero vacío.

  2. Agregue un número aleatorio en una de las celdas libres (la celda se elige aleatoriamente, y el número se elige aleatoriamente de la lista de números válidos para esto de acuerdo con las reglas del SuDoKu).

  3. Utilice el solucionador de backtracking para comprobar si la placa actual tiene al menos una solución válida. Si no, deshaga el paso 2 y repita con otro número y celda. Tenga en cuenta que este paso puede producir tableros válidos completos por sí solo, pero estos no son de ninguna manera aleatorios.

  4. Repita hasta que el tablero esté completamente lleno de números.

 40
Author: Doc Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 12:36:07

Puedes hacer trampa. Comience con un tablero de Sudoku existente que se puede resolver y luego juguetee con él.

Puede intercambiar cualquier fila de tres bloques de 3x3 con cualquier otra fila. Puede intercambiar cualquier columna de tres bloques de 3x3 con otra columna. Dentro de cada fila de bloque o columna de bloque puede intercambiar filas individuales y columnas individuales. Finalmente, puede permutar los números para que haya diferentes números en las posiciones llenas, siempre y cuando la permutación sea consistente en todo el tablero.

Ninguno de estos cambios harán que una placa resoluble sea irresoluble.

 14
Author: rossum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-03 11:29:52

A menos que P = NP, no hay un algoritmo de tiempo polinómico para generar problemas generales de Sudoku con exactamente una solución.

En su tesis de maestría, Takayuki Yato definió El Problema de Otra Solución (ASP), donde el objetivo es, dado un problema y alguna solución, encontrar una solución diferente a ese problema o demostrar que no existe. Yato luego definió ASP-completitud, problemas para los cuales es difícil encontrar otra solución, y demostró que Sudoku es ASP-completo. Dado que también demuestra que ASP-completity implica NP-hardness, esto significa que si permites tableros de Sudoku de tamaño arbitrario, no hay un algoritmo de tiempo polinómico para verificar si el rompecabezas que has generado tiene una solución única (a menos que P = NP).

Lamento arruinar sus esperanzas de un algoritmo rápido!

 9
Author: templatetypedef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 07:55:25

No Es fácil dar una solución genérica. Necesitas saber algunas cosas para generar un tipo específico de Sudoku... por ejemplo, no se puede construir un Sudoku con más de nueve grupos vacíos de 9 números (filas, bloques 3x3 o columnas). Se cree que los números mínimos dados (es decir, "pistas") en un Sudoku de solución única son 17, pero las posiciones numéricas para este Sudoku son muy específicas si no me equivoco. El número promedio de pistas para un Sudoku es de aproximadamente 26, y no estoy seguro, pero si dejas números de un completada la cuadrícula hasta tener 26 y dejarlas de forma simétrica, es posible que tengas un Sudoku válido. Por otro lado, puede simplemente dejar de lado aleatoriamente los números de las cuadrículas completadas y probarlos con CHECKER u otras herramientas hasta que aparezca un OK.

 1
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-03 10:14:23

También creo que tendrás que comprobar explícitamente la unicidad. Si usted tiene menos de 17 givens, una solución única es muy poco probable, sin embargo: Ninguno se ha encontrado todavía, aunque no está claro todavía si podría existir.)

Pero también puede usar un solucionador de SAT, en lugar de escribir un algoritmo de backtracking propio. De esa manera, puede regular hasta cierto punto lo difícil que será encontrar una solución: Si restringe las reglas de inferencia que usa el solucionador SAT, puede verificar si usted puede resolver el rompecabezas fácilmente. Solo busca en Google "sudoku de resolución de SAT".

 0
Author: DaveFar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 08:39:55

Aquí hay una manera de hacer un rompecabezas de sudoku clásico (rompecabezas de sudoku con una única solución; los cuadrados precargados son simétricos alrededor del cuadrado central R5C5).

1) comience con una cuadrícula completa (usando relleno de grupo más desplazamiento circular para obtenerla fácilmente)

2) eliminar número(s) de dos cuadrados simétricos si los cuadrados despejados se pueden inferir utilizando las pistas restantes.

3) repita (2) hasta que todos los números estén marcados.

Usando este método puede crear un rompecabezas sudoku muy fácil con o sin programación. También puedes usar este método para crear rompecabezas Sudoku más difíciles. Es posible que desee buscar "crear sudoku clásico" en YouTube para tener un ejemplo paso a paso.

 0
Author: Yaling Zheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-05 02:12:43