programacion en c: sudoku

wenas, es la primera vez q posteo alguna duda de programación ya que nunca he visto por EOL ningún hilo por el estilo salvo alguno q otro.
No sabia en q foro ponerlo así que si tiene q ser movido lo dejo a elección de los moderadores.

Ahí va mi duda, tengo q hacer un sudoku con el borland c++, en lenguaje c, y no tengo ni idea de por donde empezar, he visto mil ejemplos en Internet pero ninguno compila bien, otros me dan bucles infinitos, y mil errores mas cawento

alguien sabe como puedo hacerlo, o pasarme un código fuente para que pueda hacerme alguna idea?

muchas gracias
No es lo mismo resolver un sudoku "de los fáciles" (en los que se rellenan las casillas observando los demás números) que resolver un sodoku "de los difíciles" en los que tienes que hacer suposiciones (es decir, no tienes suficientes datos para continuar rellenando y te obliga a probar números para ver si puedes avanzar).
Si el sudoku es de los fáciles, créate una matriz de enteros. Pones los números que te dan y las incógnitas las rellenas con 0.
Ahora te tienes que crear una funcion que, dada una casilla "(fila,columna)", te determine si en esa casilla debe haber forzosamente un número. Para ello:
*Tienes una variable auxiliar (si quieres, un vector de 9 short int) inicializada a 0.
*Marcas en el vector con un 1 los números que aparezcan en la fila, en la columna y en el cuadrado de la casilla que analizas.
*Si en el vector sólo queda un 0, rellenas la casilla con el número que toque.

Ahora en el main haces un bucle que vaya barriendo continuamente todas las casillas hasta que completes el sudoku.


PD: Si el sudoku es "de los difíciles" ya pensaremos una modicicación del programa ;)
yo lo q necesito es crear un programa que cree sudokus al azar y te de opciones de dificultad, tener la posibilidad de saber la solucion y un contador de tiempo... no tengo ni idea de como hacerlo cawento
Alguna idea?
wenas, ahora el problema ha cambiado:

tengo que hacer un sudoku, pero sin generar ni solucionar ni nada, solo he imprimido una tabla con el problema original y he definido otra tabla con la solucion, mi problema es, que cuando inserto un numero en el tablero me diga si está bien o no está bien, yo habia pensado que la única manera es que compare el numero con la fila/columna correspondiente de la tabla solucion (taula2), como puedo hacer esto? porque hasta la fecha solo he conseguido bucles infinitos y demás desvarios.

Pongo el codigo de la parte que me da problemas:
case RETURN: //al presionar RETURN, seleccionas la casilla donde escriviras el numero deseado
textcolor(BLACK);
gotoxy(29,40);
cprintf("Introduce un numero");
delay(500);
// borrar el mensage anterior
textbackground(BLACK);
gotoxy(29,40); cprintf(" ");
textbackground(GREEN);
gotoxy(x,y);
scanf("%d",&num);
for (f=0;f {
for (c=0;c {
if (num==taula2[f][c])
{
textcolor(BLUE);
gotoxy(x,y);
cprintf("%d",num);
taula[f][c]=num;
}
else
{
textcolor(RED);
gotoxy(x,y);
cprintf("%d",num);
}
}
}

break;


Alguna idea?

Gracias
Para solucionarlo yo usaría Backtracking... Pero no entiendo bien qué es lo que tienes que hacer... En ese código cada vez que insertas un número ¿compruebas toda la tabla?
estaba aburrio y me puesto a intentar hacer un poquillo xD

pero vamos es una chapuza, a ver si te sirve para algo

#include
#include

using namespace std;

int main()
{
int nivel;
int valores[9][9];
int i,j;
int vertical, horizontal;
int temp;

printf("Bienvenido al Sudoko 1.0\n");
printf("------------------------\n");
printf("\nElige el nivel de dificulatad (0,1 o 2): ");
scanf ("%d",&nivel);

for ( i=0; i<9 ; i++ ) {
for ( j=0; j<9 ; j++ ){
valores[i][j]=0;
}
}

if ( nivel > 2 )
{
system("cls") ;
main();
}

else
{
if ( nivel == 0 ){

valores[0][1]=4;
valores[0][3]=3;
valores[0][7]=8;
valores[1][5]=8;
valores[1][8]=3;
valores[2][1]=8;
valores[2][4]=6;
valores[2][5]=2;
valores[2][6]=4;
valores[2][7]=1;
valores[2][8]=9;
valores[3][1]=1;
valores[3][2]=4;
valores[3][4]=3;
valores[3][6]=2;
valores[5][2]=3;
valores[5][4]=7;
valores[5][6]=8;
valores[5][7]=4;
valores[6][0]=7;
valores[6][1]=3;
valores[6][2]=6;
valores[6][3]=2;
valores[6][4]=4;
valores[6][7]=5;
valores[7][0]=8;
valores[7][3]=7;
valores[8][1]=5;
valores[8][5]=1;
valores[8][7]=9;

do{

printf("\n\n|---|---|---|---|---|---|---|---|---|\n");
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[0][0],valores[0][1],valores[0][2],valores[0][3],valores[0][4],valores[0][5],valores[0][6],valores[0][7],valores[0][8]);
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[1][0],valores[1][1],valores[1][2],valores[1][3],valores[1][4],valores[1][5],valores[1][6],valores[1][7],valores[1][8]);
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[2][0],valores[2][1],valores[2][2],valores[2][3],valores[2][4],valores[2][5],valores[2][6],valores[2][7],valores[2][8]);
printf("|---|---|---|---|---|---|---|---|---|\n");
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[3][0],valores[3][1],valores[3][2],valores[3][3],valores[3][4],valores[3][5],valores[3][6],valores[3][7],valores[3][8]);
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[4][0],valores[4][1],valores[4][2],valores[4][3],valores[4][4],valores[4][5],valores[4][6],valores[4][7],valores[4][8]);
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[5][0],valores[5][1],valores[5][2],valores[5][3],valores[5][4],valores[5][5],valores[5][6],valores[5][7],valores[5][8]);
printf("|---|---|---|---|---|---|---|---|---|\n");
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[6][0],valores[6][1],valores[6][2],valores[6][3],valores[6][4],valores[6][5],valores[6][6],valores[6][7],valores[6][8]);
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[7][0],valores[7][1],valores[7][2],valores[7][3],valores[7][4],valores[7][5],valores[7][6],valores[7][7],valores[7][8]);
printf("| %d %d %d | %d %d %d | %d %d %d |\n",valores[8][0],valores[8][1],valores[8][2],valores[8][3],valores[8][4],valores[8][5],valores[8][6],valores[8][7],valores[8][8]);
printf("|---|---|---|---|---|---|---|---|---|\n\n");

printf("Escoge una cordenada ( 1 al 9 )\n");
printf("\nCordenada horizontal: ");
scanf ("%d",&horizontal);
printf("\nCordenada vertizal: ");
scanf ("%d",&vertical);
if ( valores [horizontal-1][vertical-1] != 0 ){
printf ("\nEste valor ya es correcto\n");
system("PAUSE");}
else {
printf("\nInserte el valor ( para terminar el sudoku pulse 0 ) : ");
scanf ("%d",&temp);


if ( temp < 10 ){
//algoritmo para comprobar que el numero sea correcto
if ( horizontal==1 || horizontal==4 || horizontal==7 ){
if ( vertical==1 || vertical==4 || vertical==7 ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+1][vertical] && temp != valores [horizontal+1][vertical+1] && temp != valores [horizontal+1][vertical+2] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+2][vertical+1] && temp != valores [horizontal+2][vertical+2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}

}
}
if ( vertical==2 || vertical==5 || vertical==8 ){
if ( temp != valores [horizontal][vertical-1] && temp != valores [horizontal+1][vertical-1] && temp != valores [horizontal+2][vertical-1] && temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal+1][vertical+1] && temp != valores [horizontal+1][vertical+2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
if ( vertical==3 || vertical==6 || vertical==9 ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal][vertical-1] && temp != valores [horizontal+1][vertical-1] && temp != valores [horizontal+2][vertical-1] && temp != valores [horizontal][vertical-2] && temp != valores [horizontal+1][vertical-2] && temp != valores [horizontal+2][vertical-2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
}


if ( horizontal==2 || horizontal==5 || horizontal==8 ){
if ( vertical==1 || vertical==4 || vertical==7 ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+1][vertical] && temp != valores [horizontal+1][vertical+1] && temp != valores [horizontal+1][vertical+2] && temp != valores [horizontal-1][vertical] && temp != valores [horizontal-1][vertical+1] && temp != valores [horizontal-1][vertical+2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
if ( vertical==2 || vertical==5 || vertical==8 ){
if ( temp != valores [horizontal][vertical-1] && temp != valores [horizontal+1][vertical-1] && temp != valores [horizontal+2][vertical-1] && temp != valores [horizontal+1][vertical] && temp != valores [horizontal-1][vertical] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal+1][vertical+1] && temp != valores [horizontal+1][vertical+2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
if ( vertical==3 || vertical==6 || vertical==9 ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal-1][vertical] && temp != valores [horizontal][vertical-1] && temp != valores [horizontal+1][vertical-1] && temp != valores [horizontal-1][vertical-1] && temp != valores [horizontal][vertical-2] && temp != valores [horizontal+1][vertical-2] && temp != valores [horizontal-1][vertical-2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
}


if ( horizontal==3 || horizontal==6 || horizontal==9 ){
if ( vertical==1 || vertical==4 || vertical==7 ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+1][vertical] && temp != valores [horizontal+1][vertical+1] && temp != valores [horizontal+1][vertical+2] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+2][vertical+1] && temp != valores [horizontal+2][vertical+2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
if ( vertical==2 || vertical==5 || vertical==8 ){
if ( temp != valores [horizontal][vertical-1] && temp != valores [horizontal+1][vertical-1] && temp != valores [horizontal+2][vertical-1] && temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal+1][vertical+1] && temp != valores [horizontal+1][vertical+2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
if ( vertical==3 || vertical==6 || vertical==9 ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal-1][vertical] && temp != valores [horizontal][vertical-1] && temp != valores [horizontal+1][vertical-1] && temp != valores [horizontal-1][vertical-1] && temp != valores [horizontal][vertical-2] && temp != valores [horizontal+1][vertical-2] && temp != valores [horizontal-1][vertical-2] ){
if ( temp != valores [horizontal][vertical+8] && temp != valores [horizontal][vertical+1] && temp != valores [horizontal][vertical+2] && temp != valores [horizontal][vertical+3] && temp != valores [horizontal][vertical+4] && temp != valores [horizontal][vertical+5] && temp != valores [horizontal][vertical+6] && temp != valores [horizontal][vertical+7] ){
if ( temp != valores [horizontal+1][vertical] && temp != valores [horizontal+2][vertical] && temp != valores [horizontal+3][vertical] && temp != valores [horizontal+4][vertical] && temp != valores [horizontal+5][vertical] && temp != valores [horizontal+6][vertical] && temp != valores [horizontal+7][vertical] && temp != valores [horizontal+8][vertical] ){
valores [horizontal-1][vertical-1] = temp;}
else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");

}
}
}
}
}
}


//valores [horizontal-1][vertical-1] = temp;}
/* else{
printf("\nValor incorrecto, por favor introduce un valor entre 1 y 9. \n");
system("PAUSE");}
}*/
}
}while ( temp != 0 );

}
if ( nivel == 1 ){

}
if ( nivel == 2 ){

}
}

system("PAUSE");
return EXIT_SUCCESS;
}


solo hay un sudoku de nivel facil (dale al 0), y el algoritmo para comprobar si el numero esta bien es una chapuza y probablemente falle :P

suerte
eis gente muchas gracias, pero ayer estaba inspirado y se me ocurrieron dos o tres cosillas que me hicieron que todo funcionara bien y lo he terminado hace un rato.

Muchas gracias igualmente [beer]



PS: por lo que a mi respecta este hilo ya puede ser cerrado por los moderadores
La mejor solucióne es usar un Backtracking. La solución de HaGeN22 podría ser buena. No la he probado, pero visto qeu ha contemplado todos los casos no tiene porque fallar... Pero está claro que es impresentable [tomaaa].
si si, ahora he visto lo del Backtracking y no hacia falta rallarse tanto xD , si ve eso , mi profesor de ingenria del software fijo me envia a septiembre xD
8 respuestas