Me llegan bastantes correos de verdaderos/supuestos "estudiantes de infomática" a los cuales les exigen un algoritmo para resolver el famoso Sudoku. Mi respuesta es siempre la misma "Resuelve uno facil y analiza lo que haces, poco a poco complicate". Lo digo aqui y ahora, ayudo a quien le vea un minimo de colaboracion, no al que tenga unas practicas que presentar en veinte dias.
Que raro que en verano o en el primer semestre pongan practicas de ese tipo (lo sé por la dirección de origen del mensaje).
En mis tiempos, cuando entregaba una practica, que bien podia ser esa, me hacian un examen oral. Ahora por lo visto, vale con la url. Eso es calidad.
No es que me niegue a ceder nada, solo que para ser un buen profesional, también hay que pensar, y que todo por la cara no se consigue.
¿Donde quedo el amor propio?
Comentarios
La forma en que yo veo el problema viene a ser la misma que emplearías para resolverlo manualmente. Partir de que en principio en cada celda son posibles todos los valores y que el problema tiene una solución única.
A partir de ahí, por cada valor que se encuentra colocado en el tablero (los que nos dan por ejemplo) lo elimino de los posibles en todas las celdas relacionadas con la celda en que se encuentra dicho valor. Con esto, aunque parezca que no se eliminan muchos valores posibles, aunque quizás con ello solo se puedan determinar muy pocos valores de los que faltan (quizás ninguno).
A continuación se pueden buscar parejas y tríos en cada fila, columna o caja que eliminen valores posibles en otras casillas. También se pueden buscar casillas en las que existiendo varios posibles haya un número que solo puede estar en ella (pues en su caja, fila o columna no puede ir en las demás celdas).
Con esto se pueden resolver muchos Sudokus, pero siempre queda el resolver todos, para lo cual puedes optar por analizar cuartetos, quintuplas, etc., figuras como xwing, swordfish, etc. que son elegantes y quizás hasta complicadas de entender, o bien recurrir al backtracking (prueba y en caso de fallo probar otra alternativa). Usar el backtracking después de lo anterior incrementa notablemente el tiempo de resolución respecto a si se emplea desde el principio, pues muchas casillas ya estarán colocadas.
No conviene perder de vista que por cada casilla que se rellene la situación general cambia, pues cada nº colocado deja de ser posible en otras, por lo que estas operaciones han de realizarse periodicamente.
El algoritmo se puede complicar todo lo que quieras y el problema se puede enfocar de otras formas.
Saludos,
jagar
me gustaria agradecer publicamente, y esta es la mejor forma de hacerlo creo, a que ha creado el sudoku samurai, estoy un poquito enganchado y me encanta, soy un economista que sabe un poco de informatica para ir tirando, pero me encantan los juegos de logica, pero sin pagar porque soy un poco de la virgen del puño apretao, me encanta el de este pagina porque te permite guardarlo y continuar jugando al rato. gracias al creador.
Ole, ole y ole.
A mí también me han pedido el código del sudoku que hice este verano simplemente por diversión y que se me ocurrió colgar en mi blog (http://diariodeunmurciano.blogspot.com/) y hasta hay quien piensa que soy una mala persona si no presto ese código al primero que me lo pida (léanse los 4 últimos comentarios de ese post).
Me alegro de que hay gente que piensa como yo. Sólo pido a la gente que piense un poco. Yo estoy dispuesto a AYUDAR a la gente, no a resolverles los problemas por la cara.
Un saludo.
jaja, yo soy una de esas estudiantes de ingeniería a los que les han mandado hacer un algoritmo que resuelva sudokus (en mi caso es en pascal), he empezado hoy a "rayarme la cabeza" y con los apuntes delante algo voy sacando, no quiero el algoritmo pero si acepto sugerencias ;)...mi email es bego131@hotmail.com
un saludo
yo tengo que hacer tambien el progrmaa del sudoku, pero en C! no se como acerlo... si sqq.. es super xungo.. ajjaa! soy una estudiando d informatica d primero y en mi vida habia progrmaado.. y tenemos que hacer que se guarden partidas y eso mediante ficheros y no tengo ni idea...!! q agoooooooooo?!
Me gustaria encontrar una manera de hacer un sudoku con menos código que el que ya llevo, soy un currela que programo por gusto pero esto lo hago pa la academia. he hecho dos arrays uno pa las lineas y columnas y el otro para los cuadros grandes y los pequeños, si consigo que en ambos arrays los numeros no me coincidan en lineas y columnas me habrá salido. No se de de cosas tan finas como los algoritmos yo lo hago a lo bestia pero si me orientais un poco os lo agradeceré mazo.
yo no os voy a decir el cogido, pero si deciros q no es tan dificil...y si os cuesta platear la solucion para un sudoku9x9, que empeceis por resolverlo para uno 3x3 y luego lo ajusteis al grande....es solo una idea. saludos
Jaime, el programa ocupara lo que tenga que ocupar. Es deseable que ocupe lo minimo posible y quizás se pueda reducir algo en la fase de depuración optimización.
Yo te sugeriria que usases 2 arrays cuadrados de 9x9. En uno almacenas la solución que vas obteniendo y en el otro almacenas los valores que son posibles en cada casilla (cada celda de este array o tabla cuadrada puede ser otra tabla del 1 al 9 o una cadena (eso ya depende de como mas te guste)). A medida que se van situando numeros en el tablero solución, se van eliminando de la tabla de posibles en la fila, columna y cuadro en que se encuentra. De este modo, la obtención de la solución quizás te resulte más sencilla.
En cuanto a algoritmos, para resolver un sudoku, puedes empezar por intentar que el programa haga lo que tu hariás, ir buscando casillas en donde unicamente exista un nº posible. Cuando llegues al punto en que siempre hay más de un posible, será el momento de aplicar algoritmos o técnicas mas complejas como X-Wing, Sword-fish, etc. (que son elegantes y muy buenas, pero a veces requieren mucho código y no son tan rápidas como cabe esperar) o simplemente fuerza bruta (prueba y fallo).
Saludos,
jagar
estoy buscando el codigo fuente de sudoku nesecito que me ayuden yo se que ustedes me van ayudar por favor lo nesecito ya tengo las ideas pero no se como implementarla orienteme por favor
ayuda para corregir este codigo:
#include <stdio.h>
int sudoku[9][9]={{8,0,0,0,0,0,6,0,0},
{0,2,9,6,7,0,0,1,0},
{0,0,0,0,1,4,0,5,0},
{6,0,0,3,9,1,5,0,2},
{0,5,1,0,0,0,9,0,0},
{9,0,2,0,0,6,0,0,0},
{0,6,0,4,3,0,0,0,0},
{0,9,0,0,8,7,1,6,0},
{0,0,7,0,0,0,0,0,3}};
int tablero[9][9];
int cont=0;
void imprimir_sudoku() {
int x,y;
for(x=0;x<9;x++) {
for(y=0;y<9;y++) {
printf("%d", sudoku[x][y]);
if(y==2||y==5)
printf("|");
}
printf("\n");
if(x==2||x==5) {
printf("---+---+---");
printf("\n");
}
}
printf("\n");
}
void inicializar(int x, int y) {
int a,b;
a=x;b=y+1;
while(a<9) {
if(tablero[a][b]==0) sudoku[a][b]=0;
b++;
if (b>8) { b=0;a++; }
}
}
int comprobar(int x, int y) {
int a,b,c,correcto,retorno,contador,x2,y2;
correcto=1;
for(a=1;a<=9 && correcto;a++) {
contador=0;
for(b=0;b<9 && correcto;b++) {
if(sudoku[x][b]!=0)
if(sudoku[x][b]==a)
contador++;
}
if (contador>1) correcto=0;
}
retorno=correcto;
if(correcto) {
for(a=1;a<=9 && correcto;a++) {
contador=0;
for(b=0;b<9 && correcto;b++) {
if(sudoku[b][y]!=0)
if(sudoku[b][y]==a)
contador++;
}
if(contador>1) correcto=0;
}
retorno=correcto;
}
if(correcto) {
for(a=1;a<=9 && correcto;a++) {
x2=(x-(x % 3));
y2=(y-(y % 3));
contador=0;
for(b=x2;b<x2+3;b++) {
for(c=y2;c<y2+3;c++) {
if(sudoku[b][c]!=0)
if(sudoku[b][c]==a)
contador++;
}
}
if(contador>1) correcto=0;
}
retorno=correcto;
}
return retorno;
}
int resolver_sudoku(int x, int y) {
int a, correcto;
if (y>8) { y=0;x++; }
while(x<9 && tablero[x][y]!=0) {
y++;
if (y>8) { y=0;x++; }
}
if(x==9) {
if(!comprobar(8, 8)) {
printf("Sin solucion");
exit(-1);
} else {
imprimir_sudoku();
cont++;
if(cont==100)
exit(-1);
}
} else {
for(a=1;a<=9;a++) {
inicializar(x,y);
sudoku[x][y]=a;
correcto=comprobar(x,y);
if(correcto)
resolver_sudoku(x,y+1);
else
sudoku[x][y]=0;
}
}
}
int main() {
int x,y,correcto;
for(x=0;x<9;x++)
for(y=0;y<9;y++)
tablero[x][y]=sudoku[x][y];
correcto=1;
for(x=0;x<9 && correcto;x++)
for(y=0;y<9 && correcto;y++) {
correcto=comprobar(x,y);
}
if(!correcto)
printf("Datos de entrada incorrectos\n");
else
resolver_sudoku(0,0);
printf("Combinaciones : %d\n", cont);
}
Daniel:
Explica un poco que es en lo que quieres ayuda, pues lo unico que he tenido que hacer para que compilara bien es sustituir el exit(-1) por return -1.
Una vez compilado el programa se ha ejecutado bien muestra todas las soluciones posibles para el Sudoku planteado, que son 6 (luego está mal planteado por que deberia tener solución única).
Saludos,
jagar
El programa que tienes colgado en la página se puede descargar al disco duro de alguna manera?
REALISAR EL ALGORITMOY EL CODIGO C DE UN COLEGIO Q QUIERE MATRICULAR A SIERTA CANTIDAD DE ALUMNOS EN LOS CURSOS DE MATEMATICA(10 BACANTES)LENGUAJE(20)FISICA(15)INGLES(10)SI SE MATRICULA EN MATEMATICA Y EN LENGUAJE ESTUDIARA INGLES GRATIS LA MATRICULA ES DE 500 SOLES IMPRIMIR EL TOTAL
Antonio:
De momento no he pensado en hacer una versión descargable. Quizás en un futuro no muy lejano me anime a ello.
Saludos,
jagar
yo también necesito el código en C del sudoku. tengo que realizar un programa que simule una competición de sudokus. necesito implementar un generador de sudokus, los distintos participantes, y un árbitro que controla que no se infrinjan las reglas (a través de hebras)
Muchas gracias por adelantado
saludos
Buenas a todos, quisiera saber si alguien ha realizado el programa de buscar parejas en java. No sé cómo hacer el Jpanel, y las ImageIcons... Luego, los valores tienen que ser aleatorios (Math.random), y no pueden aparecer más de 2 (parejas) veces repetido... si alguien tiene un código parecido, me haría un gran favor.
Gracias de antemano.
Buenos dias, aunque mi correo es de españa, realmente yo estoy en Colombia, tengo de tarea hacer un sudoku en java, soy fanatico de jugar sudoku y especialmente el samurai (felicidades a quien lo hizo!)tengo la idea del algoritmo, pero soy un poco inexperto en el lenguaje, necesito que me colaboren solo en la parte gráfica del sudoku, es decir como puedo crear el tablero, que las celdas me queden como variables (o como array), que pueda modificar el color de las celdas y que sean editables las celdas que yo quiera (es decir como puedo ponerlas editables o no <<enable?>>), agradecería mucho si me pueden regalar el código en Java de esa parte gráfica, muchas gracias.
Yo soy otra estudiante de ITIS de 1º en mi vida habia programado y tampoco s jugar al sudoku,
de echo se más o menos como se resuelve dicho juego gracias a una compañera d clas que m lo explico.Y como no a mi tmb m han pedido realizaar el sudoku en Pascal y no tengo ni idea d por dond empezar.si alguien fuera tan amable de no digo mandarmelo resuelto,sino darme alguna pista,u orientarme un poco...se lo agradecería.
mi msn: laura_xiky@hotmail.com
Supongo que tienes que programar el Sudoku normal. Algo de programación en Java si conozco, pero la verdad es que lo tengo olvidado, y donde más me pierdo es precisamente donde tienes tu el problema, en el interfaz gráfico y me encuentro con el mismo problema que tu. Eso me pasa también con el C++ moderno, hace mucho que no lo uso y donde más me pierdo es en los entornos gráficos. De hecho ya lo hubiera sacado en Java, con la ventaja de que al tratarse de objetos se podría resolver el Samurai (y otros más extensos) con las mismas funciones que el normal, salvo las intersecciones, que requieren una función adicional no muy compleja. Para programar en interfaz hay que usar la libreria awt, si no me equivoco, pero de ahi ya no paso.
Esto que viene son elucubraciones mías de como lo intentaria enfocar, pues no sé si sería posible ni como funcionaría. Yo lo que haría sería asignar cuadros de edición (texto) para cada recuadro (por supuesto el sudoku lo trataria como un array de 9x9) y cada casilla del sudoku estaría asociada a uno de dichos controles, ¿por que no, un array 9x9 de controles de texto, de forma que hubiera una correspondencia biunivoca entre el control y el valor?. A partir de ahi, manejar los controles no debería ser complicado (habilitar/deshabilitar y escrcibir y/o borrar), pero no puedo decir nada por que no se como hacerlo.
Entre todas las consultas que me van haciendo aquí he ido dando indicaciones de como enfocar el problema. Te recomiendo que releas las consultas y lo que te comento a continuación a ver si con ello conseguimos que te quede más claro el tema.
Partiendo de que conocemos el problema correctamente y hemos intentado resolver algunos Sudokus (permitete el tiempo de intentar resolver unos cuantos y analizar como piensas, quizás te ayude a enfocar el problema). Es decir, empezamos mirando filas, columnas, regiones, eliminando candidatos en cada celda. Nos iremos encontrando celdas en que solo hay un candidato, pues en ellas va ese número. Pero por cada nº que colocamos, éste deja de ser candidato en esa fila o región, dejandonos quizás alguna celda más con un solo candidato. A fin de cuentas es asi como lo resolvemos manualmente, por que no por programa?. Hacerlo por fuerza bruta, prueba y fallo, es bastante mas lento, arriba tienes el código fuente en C que envió Dori (y funciona bastante bien, de hecho calcula todas las soluciones que pueda tener -un sudoku correcto solo debe tener una solución única-). Pasarlo a Pascal no debería ser muy complicado. Quizas aplicar la fuerza bruta cuando ya solo tienes con celdas varios candidatos podría ser válido.
De todos modos, cuando piden este problema para una practica, lo suelen pedir usando algo, quizás backtracking, que para mi en este caso viene a ser casi fuerza bruta. Aunque quizás lo más elegante es utilizar las técnicas que usaría una persona para resolverlo, partiendo de la premisa que todo Sudoku tiene una solución.
Saludos,
Jagar
bueno,como no,yo tambien necesito resolver un sudoku,pero lo mio es en caml (si teneis problemas con pascal, ni probeis con este lenguaje). no quiero codigo, pero si podeis poner por aqui la idea del backtracking molaria. mi compañero y yo tenemos la idea de cuando el backtracking solo hay que hacerlo una vez, pero si hay que retroceder varias veces nos perdemos...ademas, como bien sabeis, el caml es un lenguaje puramente recursivo y no nos dejan usar bucles...Por cierto, los que lo teneis que hacer en pascal no sereis de la universidad de alcala,no? gracias al que conteste y saludos
Jagar, seremos de la mimsma clase!! yo tb lo tengo el sudoku, programarlo es una mierda,lo complicado es el control de errores y el backtraking..., te todas formas creo k se han flipado con el backtraking...
Si consigues algo enviamelo por favor.
Gracias
me pidieron hacer el codigo de un sudoku en C mi idea en tener una matriz con 4 indices para recorrer tanto las cuadrillas como las filas y columnas y hay que implementar un metodo de busqueda pero no se cual seria la condición y utilizar el backtraki
Ya llevo dias y dias tratando de hacer un programa q resuelva sodokus y todavia no encuentro como hacerlo, por faaaaaaaaaaavor si tienen un codigo en C aparte del q esta publicado arriba q me puedan facilitar para guiarme se los agradezco, por faaaaaaaaaaaavor, es de urgencia, mi correo es superstarkl9@hotmail.com.
Nos pidieron hacer un programa en caml en la facultad, y nos hemos quedado bastante atascados cuando vamos a realizar la funcion para que los resuelva. Si alguien podria hacer el favor de echarnos una mano. Mi correo es alvaro_gomez_delatorre@yahoo.es
chaval,yo ya lo tengo en caml,asi que curratelo que tampoco es tan jodido
quisiera saber si alguien a realizado el programa que resuelve sodoku en Visual Basic
La mejor forma para resolver un sudoku es utilizar algoritmo de busqueda con retroceso (backtracking)
La complejidad es muy buena y la resolucion no se complica mucho, si ha alguien le interesa la tengo hecha en ada
chavales kisiera saber si el codigo de sudocu escrito en la pagina esa bueno por q me tira un error por favor haber si me pueden enviar el codigo a mi email
El código está bien escrito y probado, quizás sea algún error del navegador. Está probado con IExplorer, Mozilla y Opera y no se han detectado errores.
Revisa la configuración del navegador y de seguridad en Internet por que quizás no permita la ejecución de scripts. Si te sigue sucediendo indica el error que te da, navegador que usas, y algún detalle más que pueda ser de utilidad.
Saludos
Eu queria que me envie outros exercicios sobre "SUDOKU".
Estou fazendo a Engenharia de Computação cá no Brasil. Queria fazer mais pesquisas sobre estes problemas.
BUSCO UN PROGRAMA QUE SOLICITE LAS DIMENCIONES DE UNA MATRIZ E IMPRIMA EL VALOR DE 1 (UNO) COMO DIAGONAL Y 0 (CERO) EN EL RESTO DEVALORES. EN TURBO C Ó C++
Yo estoy en el paso siguiente jejeje. Se generar tableros válidos y se resolver cualquier sudoku por backtraking (Además que el rendimiento es muy bueno incluso en sudokus de tipo "evil"). Pero necesito ideas para poder presentar un sudoku como fácil, intermedio, dificil... Alguna regla que me podais comentar? Solo pido ideas no codigo ;)
hola porfa necesito solo la gui del juego sudoku es lomas dificil para mi
xq la progracion ya la hice y corre en eclipse mas no en java no se xq prfa ayudame gracias por tu comprension luis
esta padre esta pagina pero necesito un favor, si alguien sabe como se podria modificar en un programa realizado con archivos en c++, necesito esta ayuda y es urgente gracias y si en vdd esta padre la paginas dan buenos comentarios, gracias
por favor mandarme tutoriales de los lenguajes C++ y JAVA
Isaac:
El tutorial de C/C++ está en PDF en la página. De Java lo siento pero no lo tengo.
Saludos,
jagar
Hola soy estudiante de informática de I.T.I.G ,concretamente, toy ya en tercero , espero poder ayudar algo más, ya que mi esfuerzo me está costando.
He estado leyendo por encima..yo no tengo ke programar el sudoku pero me puede caer en examen de estructura de datos y en Ada95. Efectivamente como dicen por ahí se hace con backtracking.
El backtracking consiste en una serie de paquetes:
1) el paquete estados. con los algoritmos de inicializar, avanzar, solucionparcial, escomponentevalida, obteneralternativas, essolucion.
2) El de estrategias que es un algoritmo ke te va viendo la soluciones parciales hasta que llega a la correcta. Bueno aqui hay varios algoritmos , son un rollo y para no extenderme mucho dire que se utiliza la estrategia de buscar una solución ( tanto recursiva como imperativa) recomiendo la recursiva.
3) y bueno lueog el paquete casillas, que creo q tambien hace falta. y aqui lo que hace es gestionar lo que es la matriz del sudoku.
Ahora, código en ada,c,pascal ,visual basic..pues no tengo nada de esto..pero para el que esté muy perdido puede ver el problema de las N-REINAS o el del N-PUZZLE por internet que tambien son matrices y que vaya viendo por donde van los tiros.
Weno espero a ver, ayudado algo, yo también me pondré a hacerlo, xk no se ke me da ke me lo ponen ahora en septiembre,
saludos!
necesito el codigo fuente del juego super uno por fabor me urge si lo tienen mandenmelo al correo de min_5454@hotmail.com por fabor me urge
Buenas, si alguien tuviese el codigo fuente del sudoku en Ada, le estaría muy agradecido que me lo pudiera enviar. gracias por la ayuda.
Email: children56565@hotmail.com
si alguien tuviese el codigo fuente del sudoku en visual basic 2005 estaría muy agradecido que me lo pudiera enviar para: andrechambelleitao@gmail.com
gracias
Yo lo tengo escribanme josemariafc@hotmail.com
Por dios, currense ustedes los trabajos que luego llegamos al examen y pasa lo que pasa xD. Con todas las pistas que han dado es muy fácil resolverlo.
Podeis bajaros el codigo fuente del sudoku en:
http://sudoku.borlandia.com
AYUDENME A ENCONTRAR EL JUEGO DE LA GALLETA EN BORLAN C++
AYEDEMEN A ENCONTRAR EN PROGRAMA DE LA GALLETA EN BORLAND C++ ESCRIBAMEN A MI COORRE ELECTRONICO juancartagena2005@yahoo.com
HEY DANIEL TU problema en el codio esque tenes que retornarle valores en las fnciones qe son enteras ejemplo:
int main() {
int x,y,correcto;
for(x=0;x<9;x++)
for(y=0;y<9;y++)
tablero[x][y]=sudoku[x][y];
correcto=1;
for(x=0;x<9 && correcto;x++)
for(y=0;y<9 && correcto;y++) {
correcto=comprobar(x,y);
return0 ; //ee
eeeeeeeeeeeeeeeeeeeeeeerrrrrrrrroo}
Por favor me pueden enviar el codigo del juego buscaparejas en java?
Alguién sabe como hacer el sudoku utilizando backtraking y TDA, donde se implementen archivos sudoku y que el programa los resuelva y los traspase a otros archivos. Osea, que el usuario solo ejecuta el programa, ya que, el computador tiene que resolverlos...
Si alguién tiene algo parecido, que me lo mande al correo hermes3103@gmail.com
Desde ya muchas gracias!!!!
por favor necesito algun algoritmo que resuelva el sodoku, por favor si me lo facilitan ,..gracias
hola porfavor si alguien tiene el codigo del sudoku en c, les agradeceria que me lo manden. gracias.
hola por favor si alguien tiene el codigo del programa para resolver el sudoku en C, por favor envienmelo estoy completamente atascado en este programa, mi correo es leonardop126@yahoo.com.
muchas gracias
porfavor alguien mepuede enviar el codigo de un control de matriculas y pagos echos en netbeans
hola como estan? porfa necesito el codigo del sudoko realizado en java.... porfavor si alguien lo le agradezco q me lo envie...
wenas tengo que hacer el sudoku en clips y sin usar backtracking, alguna idea de como empezar por lo menos con los tipos d datos
hola por favor si alguien tiene el codigo del programa para resolver el sudoku en C, por favor envienmelo estoy completamente atascada en este programa, mi correo es lamonitapreciosa@yahoo.es
muchas gracias
hola a todos y a todas hola amigos yo estoy necesitando la transpuesta de una matriz y la gauss jordan el que me pueda ayudar por favor mandenme lo a mi correo por favor
Nesecito que por favor me envien a mi correo el codigo fuente del SUDOKU escrito en JAVA. Les quedaria altamente agradecidos.
necesito que me manden los siguientes codigos fuentes interpolacion de lagrange o polinomial, metodo de gauss jordan y el metodo de simpson de 1/3 o 3/8 gracias!!!
necesito q me envien en seudocodigo la solucion de sudoku por favor gracias