Está en la página 1de 3

I. E. S.

“ENRIQUE TIERNO GALVÁN” 1


DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
AVDA. JUAN CARLOS I, 12 – 28981 – PARLA (MADRID)
TELÉFONO: 91.698.11.11 FAX: 91.698.11.61

Aplicaciones Web I – 1º DAM – 10/02/2021


Ejercicio Práctico Final del 2º Trimestre – El Sudoku
Definición del Problema
Una buena definición del juego del Sudoku la podemos encontrar en la Wikipedia. Sudoku (en japonés: 数独,
sūdoku) es un juego matemático que se inventó a finales de la década de 1970, adquirió popularidad en Japón en la
década de 1984 y se dio a conocer en el ámbito internacional en 2005 cuando numerosos periódicos empezaron a
publicarlo en su sección de pasatiempos.

El objetivo del sudoku 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, es que sean nueve elementos diferenciados, que no se deben repetir en una misma fila,
columna o subcuadrícula.

Un sudoku está bien planteado si la solución es única, algo que el matemático Gary McGuire ha demostrado
que no es posible si no hay un mínimo de 17 cifras de pista al principio. 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 subcuadrícula.

Aunque informáticamente se podría generar de una forma no compleja un sudoku, el objetivo de este
ejercicio va a ser mucho más discreto que todo eso. Lo que se va a pretender es comprobar si, para un sudoku
introducido por el usuario, ese sudoku es correcto o no. O lo que es lo mismo, lo que se pretende es comprobar si
las horizontales contienen todas los números del 1 al 9 sin estar repetidos, igual con las verticales e igual con las
cuadrículas. La aplicación devolverá como resultado si los valores introducidos por el usuario son un resultado de
sudoku válido o no.

En las siguientes figuras se muestran ejemplos de sudokus válidos:

5 3 4 6 7 8 9 1 2 4 1 3 8 2 5 6 7 9 4 3 5 9 1 6 2 7 8
6 7 2 1 9 5 3 4 8 5 6 7 1 4 9 8 3 2 2 1 7 4 8 3 9 5 6
1 9 8 3 4 2 5 6 7 2 8 9 7 3 6 1 4 5 8 6 9 7 5 2 3 4 1
8 5 9 7 6 1 4 2 3 1 9 5 4 6 2 7 8 3 1 5 8 6 3 4 7 2 9
4 2 6 8 5 3 7 9 1 7 2 6 9 8 3 5 1 4 6 7 2 8 9 5 1 3 4
7 1 3 9 2 4 8 5 6 3 4 8 5 1 7 2 9 6 3 9 4 1 2 7 8 6 5
9 6 1 5 3 7 2 8 4 8 5 1 6 9 4 3 2 7 5 2 1 3 4 9 6 8 7
2 8 7 4 1 9 6 3 5 9 7 2 3 5 8 4 6 1 9 4 6 2 7 8 5 1 3
3 4 5 2 8 6 1 7 9 6 3 4 2 7 1 9 5 8 7 8 3 5 6 1 4 9 2
I. E. S. “ENRIQUE TIERNO GALVÁN” 2
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
AVDA. JUAN CARLOS I, 12 – 28981 – PARLA (MADRID)
TELÉFONO: 91.698.11.11 FAX: 91.698.11.61

Como se puede comprobar, todas las filas contienen los número del 1 al 9 sin estar repetidos. Lo mismo ocurre en
el caso de las columnas e igualmente ocurre en todas las cajas o regiones.

Y a continuación se muestran ejemplos de sudokus incorrectos, donde se marcan en rojo algunos valores
que incumplen las reglas.

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

En estos casos ocurre que, o bien en su fila, o bien en su columna, o bien en su región, los números
marcados en rojo estan repetidos o son números no válidos.

Trabajo a Desarrollar
Escribir un programa en PHP (junto con su interfaz en HTML/CSS) que implemente un comprobador de
sudoku. Se permitirá al usuario introducir una tabla de 9x9 casillas, y el programa devolverá como resultado un
mensaje de “El sudoku introducido es válido” en el caso de que cumpla las reglas, o un mensaje de “El sudoku
introducido NO es válido” en el caso de que alguna restricción no se cumpla.

Cómo abordar el problema


1. Estudiar detenidamente el problema y analizar una forma de resolverlo. Una idea es definir un programa
principal que defina la estructura del programa, y una serie de funciones, que realicen el trabajo. Pensar en
qué funciones podría construir considerando la tarea que cada una de ella va a llevar a cabo, qué
parámetros va a recibir y qué valor va a retornar.

2. Construir el programa principal, considerando el comportamiento general del programa, como cantidad de
veces que se va a repetir la simulación, llamadas a las funciones, etc. Probar que el programa compila y
ejecuta antes de pasar al siguiente apartado.

3. Construir una función ComprobarFila, que permita determinar si una fila es correcta. Se le pasa como
parámetro la fila y comprueba si los números del 1 al 9 están contenidos. Si un número está repetido (lo
cual implicaría que la fila no es correcta) supondría que otro número no se encontraría (por ejemplo, si hay
dos “9” y no hay un “2”, la función indicaría que hay un error porque el número “2” no se encuentra en la
fila, lo cual simplifica el buscar números duplicados). Del mismo modo, si un número no pertenece al rango,
I. E. S. “ENRIQUE TIERNO GALVÁN” 3
DEPARTAMENTO DE INFORMÁTICA Y COMUNICACIONES
AVDA. JUAN CARLOS I, 12 – 28981 – PARLA (MADRID)
TELÉFONO: 91.698.11.11 FAX: 91.698.11.61

implicaría que algún número del rango faltaría (con lo cual, como en el caso anterior, sería más fácil
encontrar un error porque falta un número que buscar números fuera de rango).

4. Construir una función ComprobarColumna, que permita determinar si una columna es correcta. Se le pasa
como parámetro la columna y comprueba si los números del 1 al 9 están contenidos. Si un número está
repetido (lo cual implicaría que la columna no es correcta) supondría que otro número no se encontraría
(por ejemplo, si hay dos “9” y no hay un “2”, la función indicaría que hay un error porque el número “2” no
se encuentra en la columna, lo cual simplifica el buscar números duplicados). Del mismo modo, si un
número no pertenece al rango, implicaría que algún número del rango faltaría (con lo cual, como en el caso
anterior, sería más fácil encontrar un error porque falta un número que buscar números fuera de rango).

5. Construir una función ComprobarRegión, que permita determinar si una región es correcta. Lo más fácil es
pasar la casilla inicial (su fila y columna) de la cuadrícula (a saber: (1,1), (1,4), (1,7), (4,1), (4,4), (4,7), (7,1), (7,4),
(7,7) a la función). Así, pasando la fila y la columna, comprueba si los números del 1 al 9 están contenidos en
la región que corresponde. Si un número está repetido (lo cual implicaría que la región no es correcta)
supondría que otro número no se encontraría (por ejemplo, si hay dos “9” y no hay un “2”, la función
indicaría que hay un error porque el número “2” no se encuentra en la región, lo cual simplifica el buscar
números duplicados). Del mismo modo, si un número no pertenece al rango, implicaría que algún número
del rango faltaría (con lo cual, como en el caso anterior, sería más fácil encontrar un error porque falta un
número que buscar números fuera de rango).

6. El programa, por tanto, sería comprobar las nueve filas, nueve columna y nueve regiones del sudoku. Si
todas ellas son correctas, se concluye que el sudoku es válido. En el momento que alguna de ellas no se
cumple, el proceso se termina porque se puede asegurar que el sudoku no es válido.

7. Además de, como se indica en el apartado anterior “Trabajo a Desarrollar”, indicar que el sudoku es o no
válido, debe indicar (en caso de ser un sudoku no válido) en qué lugar se produce el error que provoca
justamente que no sea correcto.

Entrega del Trabajo


Se entregarán, en archivo ZIP comprimido con el nombre del alumno (ejemplo, PerezSalas_JuanaMaria.zip)
y dentro se ubicarán los siguientes archivos:
 index.html – será el archivo que lanzará la ejecución de nuestro programa.
 sudoku.php – que contendrá el programa PHP desarrollado.
 sudoku.css – que contendrá todos los formatos del programa desarrollado en formato CSS.
 sudoky.js – que contendrá, caso de que se opte por hacerlo, todo el código JavaScript que se emplee. Este
archivo puede no incluirse si no se emplea código JavaScript en el desarrollo (no es obligatorio).

La entrega del trabajo deberá realizarse antes de las de 23:55h del día 17 de Febrero. Es decir, se disponde desde
las 08:30h del día 10 de Febrero hasta las 23:55h del día 17 de Febrero. NO SE EVALUARÁ NINGÚN TRABAJO ENTREGADO
CON RETRASO, CON INDEPENDENCIA DE LAS CIRCUNSTANCIAS QUE SE PUEDAN ACREDITAR O JUSTIFICAR.

También podría gustarte