Академический Документы
Профессиональный Документы
Культура Документы
100066663@alumnos.uc3m.es 100074356@alumnos.uc3m.es
RESUMEN
El juego del Sudoku se presenta como un problema de El objetivo del Sudoku en su versin clsica, y ms popular, es
optimizacin que tiene una nica solucin. Se estudiarn sus rellenar una cuadrcula de 81 casillas, en 9 filas y 9 columnas,
orgenes y sus caractersticas, adems de la aplicacin de diversas divididas en cajas de 3x3, con los nmeros del 1 al 9. Al rellenar
tcnicas de resolucin de problemas y optimizacin. el Sudoku debemos conseguir que no se repita ningn nmero en
las filas, columnas y tampoco en las cajas de 3x3. Un Sudoku
estar bien planteado si su solucin es nica.
Categoras y Descriptores de Temas
Sin embargo, tambin podemos encontrar otras versiones de
[Java] Lenguaje de programacin.
Sudokus con diferentes restricciones, variantes respecto a la
colocacin de los bloques, e incluso utilizando conjuntos de
Trminos Generales elementos que no sean exclusivamente numricos.
Palabras Clave
Sudoku, Optimizacin, Resolucin de Problemas, Java.
1. INTRODUCCIN
El Sudoku es un juego que consiste en un tablero de R x C
casillas, donde R nota el nmero de filas y C el nmero de
columnas. El tablero est dividido en un nmero k de bloques de
tamao r x c (con r = y c = C ) en los que colocaremos r x c
elementos diferentes.
Hay que tener en cuenta que los Sudokus vienen con un conjunto
de valores numricos ya incluidos, denominados pistas. Las pistas
no son colocadas en orden aleatorio. El nmero de pistas incluidas
inicialmente en el Sudoku nos determinar su nivel de dificultad.
Aunque la dificultad tambin est relacionada con el tiempo que
toma encontrar la solucin.
Figura 1 : Sudoku 9x9 en blanco, remarcando las 9 casillas
que forman un bloque.
1.1 Historia El concepto de cuadrados latinos se conoce desde los tiempos
El juego del Sudoku tiene sus orgenes en civilizaciones antiguas medievales, aparecieron con manuscritos rabes del siglo XIII.
como la china o la rabe. En estas civilizaciones existan unos Dicho cuadrado contiene celdas en el cual cada fila y cada
juegos denominados cuadrados mgicos a los que se les atribua columna tiene el mismo conjunto de smbolos, a diferencia del
propiedades especiales, siendo utilizados en los campos de la cuadrado mgico, en el cual no hay repeticin.
Astrologa y el Esoterismo.
En 1776 Euler mostraba como construir cuadrados mgicos con
El origen ms antiguo de los cuadrados mgicos se encuentra en un cierto nmero de celdas, en particular 9, 16, 25 y 36. Euler
una leyenda china, datada del ao 2200 a.C., la cual se puso en una rejilla letras en latn y lo llam cuadrado latino. Ms
denominaba Lo Shu. Dicho nombre significa hoja de ro, y la tarde aadi letras griegas y de ah que surgiera el cuadrado
leyenda cuenta que el emperador chino vio salir una gran tortuga greco-latino.
del ro Amarillo. La historia tena que ver con un sacrificio al dios
En sus ltimos aos Euler encontr el problema de combinar dos
del ro, ya que el rio se desbordaba e inundaba los campos
conjuntos de n smbolos de manera que en ninguna fila o columna
sembrados, perjudicando la economa del pas.
se repitieran una pareja de smbolos.
La idea del cuadrado mgico fue transmitida a los rabes por los
chinos. En la Enciclopedia del ao 990 realizada por un grupo de Figura 4: Cuadrado mgico en la fachada de la Sagrada
eruditos rabes muestra una lista de cuadrados de todos los Familia en Barcelona.
rdenes desde 3 a 9. En 1225 Ahmed al-Buni mostr como
construir cuadrados mgicos mediante una tcnica de bordeado. El Sudoku es en realidad un caso especial de los cuadrados
latinos. El Sudoku impone la restriccin adicional de que los
La primera aparicin del cuadrado mgico en la literatura islmica subgrupos de 3*3 deben contener tambin los dgitos del 1 al 9.
se da en el Jabirean Corpus. Este libro recomendaba los cuadrados Este tipo de rompecabezas se public por primera vez a finales de
mgicos como hechizos para facilitar el nacimiento de los nios. las dcadas de los 70 en la revista Math Puzzles and Logic
Dichos cuadrados consistan en 9 celdas con los nmeros del 1 al Problems de Dell Magazines. El nombre que dio Dell a este
9 ordenados con 5 en el centro de forma que el contenido de cada rompecabezas fue Number Place. Dell tom el concepto de
fila, columna y las dos diagonales sumaran 15. Los cuadrados Euler de cuadrado latino y lo aplic a una rejilla de 9*9 con la
mgicos pudieron ser introducidos en Europa a travs de Espaa adicin de 9 cajas, cada una de ellas contiene los nmeros del 1 al
durante el siglo XII. 9.
En 1984, Nikoli, la compaa lder en creacin de puzles de en el teletexto del Canal 4. La BBC Radio comenz a leer los
Japn descubri el Number place y decidi mostrarlo a los fans nmeros en voz alta en la primera versin radiofnica del Sudoku.
japoneses de los rompecabezas. En 1986, despus de aadir varias
mejoras, sobretodo creando patrones simtricos y reduciendo el La revista Teachers, financiada por el gobierno, recomienda el
nmero de pistas dadas, el Sudoku se convirti en uno de los Sudoku como un ejercicio mental en las clases y se ha insinuado
rompecabezas ms vendidos en Japn. que la resolucin de Sudokus puede ayudar a frenar la progresin
de enfermedades como el Alzheimer.
Cuando se dieron cuenta de que uno de los principales problemas
era el nombre tan largo que tena inicialmente Suuji Wa Dokushin El sudoku complet el crculo volviendo a Manhattan como un
Ni Kagiru (los nmeros deben existir slo una vez), el presidente elemento habitual del New York Post. La moda del Sudoku a
de Nikoli, lo abrevi a Sudoku (Su = nmero; Doku = nico, otras partes de EEUU cuando tanto el The Daily News como el
soltero). USA today lanzaron Sudokus el mismo da.
Dos aos despus, los japoneses introducen dos innovaciones que Hoy en da hay clubes de Sudoku, chats, libros de estrategia,
lleva el juego a una mayor popularidad en el pas del Sol vdeos, juegos para mviles, juegos de cartas, competiciones e
Naciente, el nmero de las cifras no puede pasar de 30 y las incluso un programa de televisin. El Sudoku ha aparecido en los
cuadrculas se hacen simtricas, es decir, que las cifras estn peridicos de todo el mundo y se le describe en los medios de
distribuidas de forma rotatoria y simtrica en las casillas, lo que todo el mundo como el cubo Rubik del siglo XXI y como el
concede al conjunto un aspecto ms esttico. rompecabezas que ms rpido ha crecido del mundo.
En 1997 Wayne Gould, juez neozelands, durante una visita a 2. RESOLUCIN DEL SUDOKU
Hong Kong lo descubri y prepar algunos Sudokus para el diario
MEDIANTE ALGORITMOS
britnico The Times.
El Sudoku tiene asociado dos problemas bsicos: la generacin de
tableros vlidos y la bsqueda de una solucin que lo solucione.
Respecto a la generacin de un tablero vlido, se dice que existen
dos alternativas, una de las cuales es mantener almacenados en
una base de datos un conjunto de tableros que se conocen de
antemano como vlidos y realizar una carga aleatoria de los
mismos. La segunda forma es desarrollar un algoritmo capaz de
generar los tableros por s mismos.
A finales de 2005 el rompecabezas se publicaba de forma regular En este caso el algoritmo se encargar de probar en cada casilla, y
en varios peridicos. Adems el Sudoku fue incluido diariamente a partir de una casilla inicial, cada uno de los valores disponibles,
analizando inmediatamente la validez de la decisin tomada. Si la
solucin parcial no satisface las condiciones de la Regla nica, el Si tenemos en cuenta que el conjunto de colores ser el de los
algoritmo retroceder (backtrack) al nivel de bsqueda anterior y valores que se utilizan para completar el Sudoku, el quid de esta
generar otro tablero, con el siguiente valor disponible ubicado en relacin radica en hallar una forma para representar el tablero
Sudoku con un grafo tal que cumpla las condiciones del problema
la posicin ltima de anlisis. Este proceso se repetir hasta
de coloreo. Sea V el conjunto de vrtices de nuestro grafo. Si
concretar el anlisis de la ltima casilla, con lo cual el costo consideramos = {(, ), 0 , 9} (es decir, tomamos cada
computacional ser de () , con n igual al nmero de casilla del tablero como un vrtice del grafo), podemos construir
valores posibles, R el nmero de filas, C el nmero de E (el conjunto de aristas o arcos) de acuerdo al siguiente
columnas y p el nmero de casillas con pista. A este costo se criterio: dos vrtices u y v estn unidos por un arco no dirigido
debe agregar, tambin, el de cada consulta de validez con lo cual (u,v) s y solo s u y v comparten la misma fila, columna o
bloque. En la siguiente figura se observa, para el Sudoku del
el nmero es extremamente grande.
ejemplo anterior, cmo queda conformado el subgrafo de vrtices
adyacentes para la casilla siguiendo el criterio enunciado.
Para determinados tableros, entonces, el algoritmo tardar mucho
tiempo, an con el hardware actual. La ventaja, sin embargo,
radica en que el algoritmo devolver, tarde o temprano, la
solucin esperada. En la siguiente figura mostramos el espacio de
soluciones para un pequeo Sudoku de ejemplo de 22 22
casillas, con = {1,2,3,4} .
3. ALGORITMO DE BACKTRACKING
PARA EL SUDOKU EN JAVA
Con el algoritmo backtracking implementamos una tcnica de
resolucin de problemas mediante una bsqueda sistemtica de
soluciones.
Figura 9: Nmeros que faltan en cada fila, cada
columna y cada subcuadro.
Para optimizar el backtracking se descompone cada tarea en
tareas parciales y se prueba de manera sistemtica cada una de if(esPosibleInsertar(tablero,i,j,k)){
estas subtareas.
tablero[i][j]=k;
Cuando al elegir una tarea comprobamos que no lleva a una
boolean b=resolver(tablero);
solucin, volvemos hacia atrs y probamos con una nueva. if(b){
El siguiente fragmento de cdigo Java comprueba utilizando return true;
backtracking si a travs de una serie de pistas podemos obtener }
una solucin de un Sudoku, o si no existe solucin para esas
pistas. tablero[i][j]=0;
}
public class Sudoku { }
return false;
public static final int DIMENSION =9; }
}
public static void main(String[] args){ System.out.println("Encontrada solucin:");
int[][] tablero= new int[][] { imprimir(tablero);
{0,7,0, 0,0,0, 0,8,0}, return true;
{0,5,0, 6,0,0, 0,0,1}, }
{0,0,3, 1,4,0, 0,0,0},
{9,0,6, 0,5,0, 3,0,0}, public static boolean esPosibleInsertar(int [][] tablero,
{0,0,0, 0,0,0, 0,0,0}, int i, int j, int valor){
{0,0,5, 0,2,0, 1,0,7}, //Comprueba columna
{0,0,0, 0,6,5, 7,0,0}, for(int a=0; a<DIMENSION; a++){
{3,0,0, 0,0,1, 9,2,0}, if(a!=i &&tablero[a][j]==valor){
{0,4,0, 0,0,0, 0,1,0}, return false;
}; }
imprimir(tablero);
if(!resolver(tablero)){ }
System.out.println("El Sudoku no //Comprueba fila
tiene solucin"); for(int a=0; a<DIMENSION; a++){
} if(a!=j &&tablero[i][a]==valor){
} return false;
}
public static void imprimir(int[][] tablero){ }
for(int i=0;i<DIMENSION;i++){ //Comprueba cuadardo
if(i%3==0){ int y= (i/3)*3;
System.out.println(); int x= (j/3)*3;
for(int a=0; a<DIMENSION/3;a++){
} for(int
for(int j=0; j<DIMENSION;j++){ b=0;b<DIMENSION/3;b++){
if(j%3==0){ if(a!=i
&&b!=j&&tablero[y+a][x+b]==valor){
System.out.print(" "); return false;
} }
}
System.out.print(tablero[i][j]); }
} return true;
System.out.println(); }
} }