Sudoku

De El Museo de los 8 Bits
Ir a la navegación Ir a la búsqueda

Sudoku (en japonés: 数独, sūdoku) es un pasatiempo popular que se popularizó en Japón en 1986, y se dio a conocer en el ámbito internacional en 2005. El objetivo es rellenar una cuadrícula de 9 × 9 celdas (81 casillas) dividida en subcuadrículas de 3 × 3 (también llamadas "cajas" o "regiones") con las cifras del 1 al 9 partiendo de algunos números ya dispuestos en algunas de las celdas. Aunque se podrían usar colores, letras, figuras, se conviene en usar números para mayor claridad. Lo que importa, en todo caso, es que sean nueve elementos diferenciados. No se debe repetir ninguna cifra en una misma fila, columna o subcuadrícula. Un sudoku está bien planteado si la solución es única. La resolución del problema requiere paciencia y ciertas dotes lógicas.

Ejemplo de sudoku.

La solución de un sudoku siempre es un cuadrado latino, aunque el recíproco en general no es cierto ya que el sudoku establece la restricción añadida de que no se puede repetir un mismo número en una región.

Numerosos periódicos han empezado a publicar el sudoku desde el 2005 en su sección de pasatiempos.

Reglas y terminología

El sudoku se presenta normalmente como una tabla de 9 × 9, compuesta por subtablas de 3 × 3 denominadas "regiones" (también se le llaman "cajas" o "bloques"). Algunas celdas ya contienen números, conocidos como "números dados" (o a veces "pistas"): El objetivo es rellenar las celdas vacías, con un número en cada una de ellas, de tal forma que cada columna, fila y región contenga los números 1–9 sólo una vez. Además, cada número de la solución aparece sólo una vez en cada una de las tres "direcciones", de ahí el "los números deben estar solos" que evoca el nombre del juego.

Métodos de resolución

La región 3 × 3 de la esquina superior izquierda debe contener un 7. Rastreando a lo largo y ancho los sietes localizados en cualquier lugar de la rejilla, el jugador puede eliminar todas las celdas vacías de la esquina superior izquierda que no pueden contener un 7. Esto deja sólo una celda posible (remarcada en verde).

La estrategia para resolver este rompecabezas se puede considerar como la combinación de tres procesos: escaneo, marcado y análisis.

Marcado

El escaneo viene a interrumpirse cuando no pueden descubrirse nuevos números. En este punto es necesario centrarse en algún análisis lógico. La mayoría encuentra útil guiar este análisis mediante el marcado de números candidatos en las celdas vacías. Hay dos notaciones populares: subíndices y puntos.

En la notación de subíndice, los números candidatos se escriben en pequeño en las celdas. La desventaja es que los puzles originales se publican en periódicos que habitualmente no dejan demasiado espacio para acomodar más que unos pocos dígitos. Si se usa esta notación, los resolutores crean, a menudo, una copia más grande del puzzle y emplean un lápiz afilado.

La segunda notación es un patrón de puntos con un punto en la esquina superior izquierda representando un 1 y un punto en la esquina inferior derecha representando un 9. Esta notación tiene como ventaja que puede usarse en el puzle original. Se requiere destreza para el emplazamiento de los puntos, porque la existencia de puntos desplazados o marcas inadvertidas lleva, inevitablemente, a confusión y no son fáciles de borrar sin añadir más confusión.

Análisis

Hay dos aproximaciones principales:

  • En eliminación, el progreso se realiza mediante la sucesiva eliminación de números candidatos para una o más celdas, hasta dejar sólo una elección. Después de lograr cada respuesta, debe realizarse un nuevo escaneo (habitualmente comprobando el efecto del último número). Hay una serie de tácticas de eliminación. Una de las más comunes es el "borrado del candidato no coincidente". Las celdas con idéntica configuración de números candidatos se dice que coinciden si la cantidad de números candidatos en cada una es igual al número de celdas que los contienen. Por ejemn lápiz y una goma. Esta aproximación puede ser desaprobada por puristas lógicos por demasiado ensayo y error pero puede llegar a soluciones clara y rápidamente.

Idealmente, se necesita encontrar una combinación de técnicas que eviten alguno de los inconvenientes de los elementos de arriba. El recuento de regiones, filas y columnas puede resultar aburrido. Escribir números candidatos en celdas vacías puede consumir demasiado tiempo. La aproximación "y-si" puede ser confusa a menos que se sea bien organizado. El quid de la cuestión es encontrar una técnica que minimice el recuento, el marcado y e

Resolución por ordenador

Para l Algunos programas así construidos, que emulan la resolución humana, permiten estimar la dificultad que tendrá un humano para encontrar la solución.


Para la implementación del resolvedor de sudokus utilizaremos la clase vector (fácilmente transformable en un array clásico) y tres funciones:

  • Una llamada inicial: simplemente se encarga de llamar a la función recursiva. Para darle más utilidad retornará un booleano que indicará si se ha encontrado alguna solución al sudoku.
  • Una función recursiva: se encarga del proceso de ir probando números. Incluye un parámetro de entrada/salida que indica si se ha encontrado alguna solución.
  • El comprobador de validez: simplemente es una función que retorna un booleano indicando si un valor puede estar en un sitio indicado.

El vector contendrá enteros codificando como "0" los lugares a rellenar (los "-") y como su propio valor numérico los valores preestablecidos. Al final de la implementación del resolvedor se propone una acción que lee un sudoku como el propuesto arriba y lo transforma en la matriz numérica.

Además, utilizaremos las siguientes definiciones y constantes:

const int FILS = 9; // Filas de un sudoku
const int COLS = 9; // Columnas de un sudoku

typedef vector< vector<int> > Matriz; // Definición de Matriz

Llamada inicial:

bool rellenar(Matriz& v) {
bool tr = false;
rellenar(v, 0, 0, tr); // V y TR són parámetros de E/S
return tr;
}

Función recursiva:nst Matriz& v, int fil, int col) { for (return false; } } return true; }</source>

Por si se tiene alguna duda, aquí se propone un método para leer un sudoku como el descrito arriba (caracteres de números y "-") y lo transforma en una matriz numérica de 0 (valores a introducir) y números (preestablecidos).

// Precondición: V es una Matriz de tamaño FILS x COLS
void leer(Matriz& v) {
char x;
for (int i = 0; i < FILS; ++i) {
for (int c = 0; c < COLS; ++c) {
cin >> x;
v[i][c] = x=='-' ? 0:x&0xF;
}
}
}

Niveles de dificultad

A algoritmo que resuelva el problema en tiempo polinomial, lo que no significa que éste no exista.

Los programas informáticos que resuelven sudokus pueden estimar la dificultad que tiene un humano para encontrar la solución, basándose en la complejidad de las técnicas de resolución necesarias. Esta estimación permite a los editores adaptar sus sudokus para personas con diferente experiencia resolutoria. Algunas versiones "en línea" (online) también ofrecen varios niveles de dificultad.

Construcción

Es posible establecer sudokus con más de una solución y también realizar tableros iniciales de sudoku sin solución, pero no se consideran rompecabezas sudoku apropiados; como la mayor parte de los rompecabezas lógicos, se espera una solución única.

La construcción de un rompecabeza sudoku puede ser realizada a mano eficientemente predeterminando las posiciones de los números dados y asignándoles valores para realizar un proceso deductivo. Such an undefined given can be assumed to not hold any particular value as long as it is given a different value before construction is completed; the solver will be able to make the same deductions stemming from such assumptions, as at that point the given is very much defined as something else. This technique gives the constructor greater control over the flow of puzzle solving, leading the solver alvistas compuestas íntegramente por sudokus.

Los sudoku Nikoli se construyen a mano, y el nombre del autor aparece en los créditos junto a cada rompecabeza; los números dados siempre se encuentran en forma de un patrón simétrico. Los rompecabezas Number Place Challenger de Dell (véase Variantes más abajo) también citan los créditos del autor. Los rompecabezas sudoku que aparecen en la mayoría de los periódicos del Reino Unido aparentemente son generados por ordenador, pero emplean probables en sudokus generados por ordenador. El desafío para los programadores de sudokus es enseñar a un programa cómo construir rompecabezas inteligentes, de manera que no se puedan distinguir de aquellos realizados por humanos; Wayne Gould necesitó retocar su popular programa durante seis años para creer que había alcanzado ese nivel.

Notas

Atribución

Este artículo proviene originalmente de Wikipedia
que lo licencia simultáneamente bajo las licencias

Creative Commons Reconocimiento - CompartirIgual 3.0
y la licencia de documentación libre GNU v.1.2 y posteriores
El Museo de los 8 Bits lo integra en su wiki bajo cc-by-sa-3.0

Creative Commons License
GNU head