Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cypascal en 28 Noviembre 2012, 01:30 am



Título: C/C++ RESOLVER SUDOKU
Publicado por: cypascal en 28 Noviembre 2012, 01:30 am
Pues eso, que me he hecho un programa que resuelve sudokus en C/C++ (Está escrito en C) y me gustaría enseñaroslo a ver que opinais. ¿En que se diferencia de los demás? Pués en que resuelve los sudokus mediante lógica, como los humanos, no mediante prueba y error. Aprovechando que los resuelve de este modo, el programa indica las técnicas utilizadas para llegar a la resolución total.

En cuanto a como introducri los datos y tal, el programa es bastante cutre, cuando tenga tiempo ya mejoraré ese aspecto. De todas formas, se explica en el enlace que os dejo, basicamente es crear un fichero de texto con los numeros quel sudoku, y en caso de casillas vacias poner un 0. Las tecnicas que utiliza se explican en la segunda entrada, en la primera está el codigo.
Os lo dejo en esta dirección el programa:

http://cypascal.blogspot.com.es/2012/09/include-include-visita-www.html (http://cypascal.blogspot.com.es/2012/09/include-include-visita-www.html)
http://cypascal.blogspot.com.es/2012/09/resolver-sudokus-en-cc.html (http://cypascal.blogspot.com.es/2012/09/resolver-sudokus-en-cc.html)

y tambien aqui. (Son demasiadas lineas pero bueno).

Código:
#include <stdio.h>
#include <stdlib.h>

/*VISITA WWW.CYPASCAL.BLOGSPOT.COM*/

struct TpCasilla
{
int HayNum;
int Num;
int Posibilidades;
int Posibles[10];
};



void LecturaDatos(struct TpCasilla T[][10]);
void InicializarDatos(struct TpCasilla T[][10]);
void ImprimeDatos(struct TpCasilla T[][10]);
void ImprimeDatos2(struct TpCasilla T[][10]);
void ImprimeDatos3(struct TpCasilla T[][10]);
void ImprimeDatos4(struct TpCasilla T[][10]);

void CandidatosSolos(struct TpCasilla T[][10], int *P);
void CandBloq1(struct TpCasilla T[][10], int *P,int U[]);
void CandBloq2(struct TpCasilla T[][10], int *P,int U[]);
void Desnudas(struct TpCasilla T[][10], int *P,int U[]);
void Escondidas(struct TpCasilla T[][10], int *P,int U[]);
void X_Wing(struct TpCasilla T[][10], int *P,int U[]);

int main(void)
{
struct TpCasilla Tablero[10][10];
int Usos[20],a,Puesto;

printf("\n\n         Bienvenido a 'SUDOKU RESOLVER'\n\n");
printf("Si quieres mas informacion visita WWW.CYPASCAL.BLOGSPOT.COM\n\n\n");
InicializarDatos(Tablero);
LecturaDatos(Tablero);

Puesto=1;
ImprimeDatos4(Tablero); a=0;
for(a=1;a<=20;a++) Usos[a]=0;

while (Puesto==1){
Puesto=0;
CandidatosSolos(Tablero,&Puesto);
if (Puesto==0){
CandBloq1(Tablero,&Puesto,Usos);
if(Puesto==0){
CandBloq2(Tablero,&Puesto,Usos);
if (Puesto==0){
Desnudas(Tablero,&Puesto,Usos);
if (Puesto==0){
Escondidas(Tablero,&Puesto,Usos);
if (Puesto==0){
X_Wing(Tablero,&Puesto,Usos);
}}}}}
ImprimeDatos4(Tablero);
}

if(Usos[1]==1) printf("\n Se ha utilizado Candidatos Bloqueados 1\n");
if(Usos[2]==1) printf("\n Se ha utilizado Candidatos Bloqueados 2\n");
if(Usos[3]==1) printf("\n Se ha utilizado Desnudas Parejas\n");
if(Usos[4]==1) printf("\n Se ha utilizado Desnudas Trios\n");
if(Usos[5]==1) printf("\n Se ha utilizado Desnudas Cuartetos\n");
if(Usos[6]==1) printf("\n Se ha utilizado Escondidos Parejas\n");
if(Usos[7]==1) printf("\n Se ha utilizado Escondidos Trios\n");
if(Usos[8]==1) printf("\n Se ha utilizado Escondidos Cuartetos\n");
if(Usos[9]==1) printf("\n Se ha utilizado X-Wing\n");
if(Usos[10]==1) printf("\n Se ha utilizado Swordfish\n");
scanf("%c");
return(0);
}

void CandidatosSolos(struct TpCasilla T[][10], int *P){
int a,b,c,d,e,N;
for (b=1;b<=9;b++)
for (a=1;a<=9;a++){
if (T[a][b].HayNum==1){
N=T[a][b].Num;
for (c=1;c<=9;c++)
if (T[a][c].HayNum==0) {
if (T[a][c].Posibles[N]!=0){
T[a][c].Posibles[N]=0;
T[a][c].Posibilidades--;
*P=1;}
if (T[a][c].Posibilidades==1) {
*P=1;
e=1;
while (T[a][c].Posibles[e]!=1) e++;
T[a][c].Posibilidades=0;
T[a][c].Num=e;
T[a][c].HayNum=1;
}}

for (c=1;c<=9;c++)
if (T[c][b].HayNum==0) {
if (T[c][b].Posibles[N]!=0){
T[c][b].Posibles[N]=0;
T[c][b].Posibilidades--;
*P=1;}
if (T[c][b].Posibilidades==1) {
*P=1;
e=1;
while (T[c][b].Posibles[e]!=1) e++;
T[c][b].Posibilidades=0;
T[c][b].Num=e;
T[c][b].HayNum=1;
}}

for (c=(((a-1)/3)*3+1);c<=(((a-1)/3)*3+3);c++)
for(d=(((b-1)/3)*3+1);d<=(((b-1)/3)*3+3);d++){
if (T[c][d].HayNum==0) {
if (T[c][d].Posibles[N]!=0){
T[c][d].Posibles[N]=0;
T[c][d].Posibilidades--;
*P=1;}

if (T[c][d].Posibilidades==1) {
*P=1;
e=1;
while (T[c][d].Posibles[e]!=1) e++;
T[c][d].Posibilidades=0;
T[c][d].Num=e;
T[c][d].HayNum=1;
}}}}}}

void CandBloq1(struct TpCasilla T[][10], int *P,int U[])
{
struct TpPos
{
int Fila;
int Columna;
};

int FilR,ColR,Fil,Col,N,AlinF,AlinC;
struct TpPos Pos[10];

for (FilR=1;FilR<=3;FilR++)
for (ColR=1;ColR<=3;ColR++)
for (N=1;N<=9;N++){
Pos[0].Fila=0;
for (Fil=((3*FilR)-2);Fil<=(3*FilR);Fil++)
for (Col=((3*ColR)-2);Col<=(3*ColR);Col++)
if ((T[Fil][Col].Posibles[N]==1)&&(T[Fil][Col].HayNum==0))
{
Pos[0].Fila++;
Pos[Pos[0].Fila].Fila=Fil;
Pos[Pos[0].Fila].Columna=Col;
}
if (Pos[0].Fila==1){
T[Pos[1].Fila][Pos[1].Columna].HayNum=1;
T[Pos[1].Fila][Pos[1].Columna].Num=N;
T[Pos[1].Fila][Pos[1].Columna].Posibilidades=0;
*P=1;
U[1]=1;
for (Col=1;Col<=9;Col++)
T[Pos[1].Fila][Pos[1].Columna].Posibles[Col]=0;
}
else if (Pos[0].Fila>=1){
AlinF=1;AlinC=1;
for (Col=1;Col<=Pos[0].Fila;Col++){
if (Pos[Col].Fila!=Pos[1].Fila) AlinF=0;
if (Pos[Col].Columna!=Pos[1].Columna) AlinC=0;
}
if (AlinF==1)
for (Col=1;Col<=9;Col++)
if (((((Col-1)/3)+1)!=ColR)&&
(T[Pos[1].Fila][Col].HayNum==0)&&
(T[Pos[1].Fila][Col].Posibles[N]!=0)){
*P=1;
T[Pos[1].Fila][Col].Posibles[N]=0;
T[Pos[1].Fila][Col].Posibilidades--;
U[1]=1;
}
if (AlinC==1)
for (Fil=1;Fil<=9;Fil++)
if (((((Fil-1)/3)+1)!=FilR)&&
(T[Fil][Pos[1].Columna].HayNum==0)&&
(T[Fil][Pos[1].Columna].Posibles[N]!=0)){
T[Fil][Pos[1].Columna].Posibles[N]=0;
T[Fil][Pos[1].Columna].Posibilidades--;
*P=1;
U[1]=1;
}}}}

void CandBloq2(struct TpCasilla T[][10], int *P,int U[])
{
int Fil,Fil2,Col,Col2,N,Pos[10],Mismo3x3,MismaCol,MismaFil;

for (Fil=1;Fil<=9;Fil++)
for(N=1;N<=9;N++){
Pos[0]=0;Mismo3x3=1;
for(Col=1;Col<=9;Col++)
if ((T[Fil][Col].Posibles[N]==1)&&(T[Fil][Col].HayNum==0)){
Pos[0]++;
Pos[Pos[0]]=Col;
if (((Col-1)/3)!=((Pos[1]-1)/3)) Mismo3x3=0;
}
if (Mismo3x3==1){
if (Pos[0]==1){
T[Fil][Pos[1]].HayNum=1;
T[Fil][Pos[1]].Num=N;
T[Fil][Pos[1]].Posibilidades=0;
*P=1;
U[2]=1;
}
if (Pos[0]!=0)
for (Col2=((((Pos[1]-1)/3)*3)+1);
Col2<=((((Pos[1]-1)/3)+1)*3);Col2++)
for (Fil2=((((Fil-1)/3)*3)+1);
Fil2<=((((Fil-1)/3)+1)*3);Fil2++)
if ((T[Fil2][Col2].Posibles[N]==1)&&
(T[Fil2][Col2].HayNum==0)){
MismaCol=0;
for (Col=1;Col<=Pos[0];Col++)
if (Pos[Col]==Col2) MismaCol=1;
if ((MismaCol==0)||(Fil!=Fil2)){
T[Fil2][Col2].Posibilidades--;
T[Fil2][Col2].Posibles[N]=0;
*P=1;
U[2]=1;}
}}}

for (Col=1;Col<=9;Col++)
for(N=1;N<=9;N++){
Pos[0]=0;Mismo3x3=1;
for(Fil=1;Fil<=9;Fil++){
if ((T[Fil][Col].Posibles[N]==1)&&(T[Fil][Col].HayNum==0)){
Pos[0]++;
Pos[Pos[0]]=Fil;
if (((Fil-1)/3)!=((Pos[1]-1)/3)) Mismo3x3=0;
}

}
if (Mismo3x3==1){
if (Pos[0]==1){
T[Pos[1]][Col].HayNum=1;
T[Pos[1]][Col].Num=N;
T[Pos[1]][Col].Posibilidades=0;
U[2]=1;
*P=1;}
if (Pos[0]!=0)
for (Fil2=((((Pos[1]-1)/3)*3)+1);
Fil2<=((((Pos[1]-1)/3)+1)*3);Fil2++)
for (Col2=((((Col-1)/3)*3)+1);
Col2<=((((Col-1)/3)+1)*3);Col2++)
if ((T[Fil2][Col2].Posibles[N]==1)&&
(T[Fil2][Col2].HayNum==0)){
MismaFil=0;
if (Pos[0]!=0) for (Fil=1;Fil<=Pos[0];Fil++)
if (Pos[Fil]==Fil2) MismaFil=1;
if ((MismaFil==0)||(Col!=Col2)){
T[Fil2][Col2].Posibilidades--;
T[Fil2][Col2].Posibles[N]=0;
U[2]=1;
*P=1;
}}}}}

void Desnudas(struct TpCasilla T[][10], int *P,int U[])
{
int a[2],b[2],c[2],d[2],N,N2,Fila,Col,Pos[10];

for (Fila=1;Fila<=9;Fila++)
for (a[0]=1;a[0]<=8;a[0]++)
for (b[0]=a[0]+1;b[0]<=9;b[0]++)
if((T[Fila][a[0]].HayNum==0)&&(T[Fila][b[0]].HayNum==0)){
Pos[0]=0;
for (N=1;N<=9;N++)
if ((T[Fila][a[0]].Posibles[N]==1)||
(T[Fila][b[0]].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}
if (Pos[0]==2){
for (N=0;N<=9;N++)
if (((a[0]!=N)&&(b[0]!=N))&&(T[Fila][N].HayNum==0)){
if (T[Fila][N].Posibles[Pos[1]]==1){
T[Fila][N].Posibles[Pos[1]]=0;
T[Fila][N].Posibilidades--;
U[3]=1;
*P=1;}
if (T[Fila][N].Posibles[Pos[2]]==1){
T[Fila][N].Posibles[Pos[2]]=0;
T[Fila][N].Posibilidades--;
U[3]=1;
*P=1;}
}}}

for (Fila=1;Fila<=9;Fila++)
for (a[0]=1;a[0]<=7;a[0]++)
for (b[0]=a[0]+1;b[0]<=8;b[0]++)
for (c[0]=b[0]+1;c[0]<=9;c[0]++)
if((T[Fila][a[0]].HayNum==0)&&(T[Fila][b[0]].HayNum==0)
&&(T[Fila][c[0]].HayNum==0)){
Pos[0]=0;
for (N=1;N<=9;N++){
if ((T[Fila][a[0]].Posibles[N]==1)||
(T[Fila][b[0]].Posibles[N]==1)
||(T[Fila][c[0]].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}}
if (Pos[0]==3){
for (N=0;N<=9;N++)
if (((a[0]!=N)&&(b[0]!=N)&&(c[0]!=N))&&
(T[Fila][N].HayNum==0)){
if (T[Fila][N].Posibles[Pos[1]]==1){
T[Fila][N].Posibles[Pos[1]]=0;
T[Fila][N].Posibilidades--;
U[4]=1;
*P=1;}
if (T[Fila][N].Posibles[Pos[2]]==1){
T[Fila][N].Posibles[Pos[2]]=0;
T[Fila][N].Posibilidades--;
U[4]=1;
*P=1;}
if (T[Fila][N].Posibles[Pos[3]]==1){
T[Fila][N].Posibles[Pos[3]]=0;
T[Fila][N].Posibilidades--;
U[4]=1;
*P=1;}
}}}

for (Fila=1;Fila<=9;Fila++)
for (a[0]=1;a[0]<=6;a[0]++)
for (b[0]=a[0]+1;b[0]<=7;b[0]++)
for (c[0]=b[0]+1;c[0]<=8;c[0]++)
for (d[0]=c[0]+1;d[0]<=9;d[0]++)
if((T[Fila][a[0]].HayNum==0)&&(T[Fila][b[0]].HayNum==0)
&&(T[Fila][c[0]].HayNum==0)&&(T[Fila][d[0]].HayNum==0)){
Pos[0]=0;
for (N=1;N<=9;N++){
if ((T[Fila][a[0]].Posibles[N]==1)||
(T[Fila][b[0]].Posibles[N]==1)||
(T[Fila][c[0]].Posibles[N]==1)||
(T[Fila][d[0]].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}}
if (Pos[0]==4){
for (N=0;N<=9;N++)
if (((a[0]!=N)&&(b[0]!=N)&&(c[0]!=N)
&&(d[0]!=N))&&(T[Fila][N].HayNum==0)){
if (T[Fila][N].Posibles[Pos[1]]==1){
T[Fila][N].Posibles[Pos[1]]=0;
T[Fila][N].Posibilidades--;
U[5]=1;
*P=1;}
if (T[Fila][N].Posibles[Pos[2]]==1){
T[Fila][N].Posibles[Pos[2]]=0;
T[Fila][N].Posibilidades--;
U[5]=1;
*P=1;}
if (T[Fila][N].Posibles[Pos[3]]==1){
T[Fila][N].Posibles[Pos[3]]=0;
T[Fila][N].Posibilidades--;
U[5]=1;
*P=1;}
if (T[Fila][N].Posibles[Pos[4]]==1){
T[Fila][N].Posibles[Pos[4]]=0;
T[Fila][N].Posibilidades--;
U[5]=1;
*P=1;}
}}}

for (Col=1;Col<=9;Col++)
for (a[0]=1;a[0]<=8;a[0]++)
for (b[0]=a[0]+1;b[0]<=9;b[0]++)
if((T[a[0]][Col].HayNum==0)&&(T[b[0]][Col].HayNum==0)){
Pos[0]=0;
for (N=1;N<=9;N++)
if ((T[a[0]][Col].Posibles[N]==1)||
(T[b[0]][Col].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}
if (Pos[0]==2){
for (N=0;N<=9;N++)
if (((a[0]!=N)&&(b[0]!=N))&&(T[N][Col].HayNum==0)){
if (T[N][Col].Posibles[Pos[1]]==1){
T[N][Col].Posibles[Pos[1]]=0;
T[N][Col].Posibilidades--;
U[3]=1;
*P=1;}
if (T[N][Col].Posibles[Pos[2]]==1){
T[N][Col].Posibles[Pos[2]]=0;
T[N][Col].Posibilidades--;
U[3]=1;
*P=1;}
}}}

for (Col=1;Col<=9;Col++)
for (a[0]=1;a[0]<=7;a[0]++)
for (b[0]=a[0]+1;b[0]<=8;b[0]++)
for (c[0]=b[0]+1;c[0]<=9;c[0]++)
if((T[a[0]][Col].HayNum==0)&&(T[b[0]][Col].HayNum==0)
&&(T[c[0]][Col].HayNum==0))
{
Pos[0]=0;
for (N=1;N<=9;N++){
if ((T[a[0]][Col].Posibles[N]==1)||
(T[b[0]][Col].Posibles[N]==1)||
(T[c[0]][Col].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}}
if (Pos[0]==3){
for (N=0;N<=9;N++)
if (((a[0]!=N)&&(b[0]!=N)&&(c[0]!=N))&&
(T[N][Col].HayNum==0)){
if (T[N][Col].Posibles[Pos[1]]==1){
T[N][Col].Posibles[Pos[1]]=0;
T[N][Col].Posibilidades--;
U[4]=1;
*P=1;}
if (T[N][Col].Posibles[Pos[2]]==1){
T[N][Col].Posibles[Pos[2]]=0;
T[N][Col].Posibilidades--;
U[4]=1;
*P=1;}
if (T[N][Col].Posibles[Pos[3]]==1){
T[N][Col].Posibles[Pos[3]]=0;
T[N][Col].Posibilidades--;
U[4]=1;
*P=1;}
}}}

for (Col=1;Col<=9;Col++)
for (a[0]=1;a[0]<=6;a[0]++)
for (b[0]=a[0]+1;b[0]<=7;b[0]++)
for (c[0]=b[0]+1;c[0]<=8;c[0]++)
for (d[0]=c[0]+1;d[0]<=9;d[0]++)
if((T[a[0]][Col].HayNum==0)&&(T[b[0]][Col].HayNum==0)
&&(T[c[0]][Col].HayNum==0)&&(T[d[0]][Col].HayNum==0)){
Pos[0]=0;
for (N=1;N<=9;N++){
if ((T[a[0]][Col].Posibles[N]==1)||
(T[b[0]][Col].Posibles[N]==1)
||(T[c[0]][Col].Posibles[N]==1)||
(T[d[0]][Col].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}}
if (Pos[0]==4){
for (N=0;N<=9;N++)
if (((a[0]!=N)&&(b[0]!=N)&&(c[0]!=N)&&(d[0]!=N))&&
(T[N][Col].HayNum==0)){
if (T[N][Col].Posibles[Pos[1]]==1){
T[N][Col].Posibles[Pos[1]]=0;
T[N][Col].Posibilidades--;
U[5]=1;
*P=1;}
if (T[N][Col].Posibles[Pos[2]]==1){
T[N][Col].Posibles[Pos[2]]=0;
T[N][Col].Posibilidades--;
U[5]=1;
*P=1;}
if (T[N][Col].Posibles[Pos[3]]==1){
T[N][Col].Posibles[Pos[3]]=0;
T[N][Col].Posibilidades--;
U[5]=1;
*P=1;}
if (T[N][Col].Posibles[Pos[4]]==1){
T[N][Col].Posibles[Pos[4]]=0;
T[N][Col].Posibilidades--;
U[5]=1;
*P=1;}
}}}

for (Fila=1;Fila<=3;Fila++) for (Col=1;Col<=3;Col++)
for (a[0]=(Fila*3)-2;a[0]<=(Fila*3);a[0]++)
for (a[1]=(Col*3)-2;a[1]<=(Col*3);a[1]++)
for (b[0]=(Fila*3)-2;b[0]<=(Fila*3);b[0]++)
for (b[1]=(Col*3)-2;b[1]<=(Col*3);b[1]++)
if((T[a[0]][a[1]].HayNum==0)&&(T[b[0]][b[1]].HayNum==0)&&
((a[0]!=b[0])||(a[1]!=b[1]))){
Pos[0]=0;
for (N=1;N<=9;N++)
if ((T[a[0]][a[1]].Posibles[N]==1)||
(T[b[0]][b[1]].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}
if (Pos[0]==2){
for (N=(Fila*3)-2;N<=(Fila*3);N++)
for (N2=(Col*3)-2;N2<=(Col*3);N2++)
if ((((a[0]!=N)||(a[1]!=N2))&&((b[0]!=N)||(b[1]!=N2)))
&&(T[N][N2].HayNum==0)){
if (T[N][N2].Posibles[Pos[1]]==1){
T[N][N2].Posibles[Pos[1]]=0;
T[N][N2].Posibilidades--;
U[3]=1;
*P=1;}
if (T[N][N2].Posibles[Pos[2]]==1){
T[N][N2].Posibles[Pos[2]]=0;
T[N][N2].Posibilidades--;
U[3]=1;
*P=1;}
}}}

for (Fila=1;Fila<=3;Fila++) for (Col=1;Col<=3;Col++)
for (a[0]=(Fila*3)-2;a[0]<=(Fila*3);a[0]++)
for (a[1]=(Col*3)-2;a[1]<=(Col*3);a[1]++)
for (b[0]=(Fila*3)-2;b[0]<=(Fila*3);b[0]++)
for (b[1]=(Col*3)-2;b[1]<=(Col*3);b[1]++)
for (c[0]=(Fila*3)-2;c[0]<=(Fila*3);c[0]++)
for (c[1]=(Col*3)-2;c[1]<=(Col*3);c[1]++)
if((T[a[0]][a[1]].HayNum==0)&&(T[b[0]][b[1]].HayNum==0)&&
(T[c[0]][c[1]].HayNum==0)&&((a[0]!=b[0])||(a[1]!=b[1]))
&&((a[0]!=c[0])||(a[1]!=c[1]))&&((c[0]!=b[0])||(c[1]!=b[1]))){
Pos[0]=0;
for (N=1;N<=9;N++)
if ((T[a[0]][a[1]].Posibles[N]==1)||
(T[b[0]][b[1]].Posibles[N]==1)||
(T[c[0]][c[1]].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}
if (Pos[0]==3){
for (N=(Fila*3)-2;N<=(Fila*3);N++)
for (N2=(Col*3)-2;N2<=(Col*3);N2++)
if ((((a[0]!=N)||(a[1]!=N2))&&((b[0]!=N)||(b[1]!=N2))
&&((c[0]!=N)||(c[1]!=N2)))&&(T[N][N2].HayNum==0)){
if (T[N][N2].Posibles[Pos[1]]==1){
T[N][N2].Posibles[Pos[1]]=0;
T[N][N2].Posibilidades--;
U[4]=1;
*P=1;}
if (T[N][N2].Posibles[Pos[2]]==1){
T[N][N2].Posibles[Pos[2]]=0;
T[N][N2].Posibilidades--;
U[4]=1;
*P=1;}
if (T[N][N2].Posibles[Pos[3]]==1){
T[N][N2].Posibles[Pos[3]]=0;
T[N][N2].Posibilidades--;
U[4]=1;
*P=1;}
}}}

for (Fila=1;Fila<=3;Fila++) for (Col=1;Col<=3;Col++)
for (a[0]=(Fila*3)-2;a[0]<=(Fila*3);a[0]++)
for (a[1]=(Col*3)-2;a[1]<=(Col*3);a[1]++)
for (b[0]=(Fila*3)-2;b[0]<=(Fila*3);b[0]++)
for (b[1]=(Col*3)-2;b[1]<=(Col*3);b[1]++)
for (c[0]=(Fila*3)-2;c[0]<=(Fila*3);c[0]++)
for (c[1]=(Col*3)-2;c[1]<=(Col*3);c[1]++)
for (d[0]=(Fila*3)-2;d[0]<=(Fila*3);d[0]++)
for (d[1]=(Col*3)-2;d[1]<=(Col*3);d[1]++)
if((T[a[0]][a[1]].HayNum==0)&&(T[b[0]][b[1]].HayNum==0)&&
(T[c[0]][c[1]].HayNum==0)&&(T[d[0]][d[1]].HayNum==0)&&
((a[0]!=b[0])||(a[1]!=b[1]))&&((a[0]!=c[0])||(a[1]!=c[1]))&&
((c[0]!=b[0])||(c[1]!=b[1]))&&((d[0]!=a[0])||(d[1]!=a[1]))&&
((d[0]!=b[0])||(d[1]!=b[1]))&&((c[0]!=d[0])||(c[1]!=d[1]))){
Pos[0]=0;
for (N=1;N<=9;N++)
if ((T[a[0]][a[1]].Posibles[N]==1)||
(T[b[0]][b[1]].Posibles[N]==1)||
(T[c[0]][c[1]].Posibles[N]==1)||
(T[d[0]][d[1]].Posibles[N]==1)){
Pos[0]++;
Pos[Pos[0]]=N;
}
if (Pos[0]==4){
for (N=(Fila*3)-2;N<=(Fila*3);N++)
for (N2=(Col*3)-2;N2<=(Col*3);N2++)
if ((((a[0]!=N)||(a[1]!=N2))&&((b[0]!=N)||(b[1]!=N2))
&&((c[0]!=N)||(c[1]!=N2))&&((d[0]!=N)||(d[1]!=N2)))
&&(T[N][N2].HayNum==0)){
if (T[N][N2].Posibles[Pos[1]]==1){
T[N][N2].Posibles[Pos[1]]=0;
T[N][N2].Posibilidades--;
U[5]=1;
*P=1;}
if (T[N][N2].Posibles[Pos[2]]==1){
T[N][N2].Posibles[Pos[2]]=0;
T[N][N2].Posibilidades--;
U[5]=1;
*P=1;}
if (T[N][N2].Posibles[Pos[3]]==1){
T[N][N2].Posibles[Pos[3]]=0;
T[N][N2].Posibilidades--;
U[5]=1;
*P=1;}
if (T[N][N2].Posibles[Pos[4]]==1){
T[N][N2].Posibles[Pos[4]]=0;
T[N][N2].Posibilidades--;
U[5]=1;
*P=1;}
}}}}

void Escondidas(struct TpCasilla T[][10], int *P,int U[])
{
struct TpPos
{
int C;
int F;};

int a,b,c,d,N,Estan[10],Fila,Col,FilaR,ColR;
struct TpPos Pos[10];

for (Fila=1;Fila<=9;Fila++)
for(a=1;a<=8;a++)
for(b=a+1;b<=9;b++)
{
for(Col=1;Col<=9;Col++) Estan[Col]=0;
Pos[0].C=0;
for(Col=1;Col<=9;Col++)
   if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1))
&&(T[Fila][Col].HayNum!=1))
{
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
Pos[0].C++;
Pos[Pos[0].C].C=Col;}
if ((Pos[0].C==2)&&(Estan[a]==1)&&(Estan[b]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)){
if (T[Fila][Pos[1].C].Posibles[N]==1){
T[Fila][Pos[1].C].Posibles[N]=0;
T[Fila][Pos[1].C].Posibilidades--;
U[6]=1;
*P=1;}
if (T[Fila][Pos[2].C].Posibles[N]==1){
T[Fila][Pos[2].C].Posibles[N]=0;
T[Fila][Pos[2].C].Posibilidades--;
U[6]=1;
*P=1;}
}}

for (Fila=1;Fila<=9;Fila++)
for(a=1;a<=7;a++)
for(b=a+1;b<=8;b++)
for(c=b+1;c<=9;c++){
for(Col=1;Col<=9;Col++) Estan[Col]=0;
Pos[0].C=0;
for(Col=1;Col<=9;Col++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1)
||(T[Fila][Col].Posibles[c]==1))&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
if(T[Fila][Col].Posibles[c]==1) Estan[c]=1;
Pos[0].C++;
Pos[Pos[0].C].C=Col;}
if ((Pos[0].C==3)&&(Estan[a]==1)&&(Estan[b]==1)&&(Estan[c]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)&&(N!=c)){
if (T[Fila][Pos[1].C].Posibles[N]==1){
T[Fila][Pos[1].C].Posibles[N]=0;
T[Fila][Pos[1].C].Posibilidades--;
U[7]=1;
*P=1;}
if (T[Fila][Pos[2].C].Posibles[N]==1){
T[Fila][Pos[2].C].Posibles[N]=0;
T[Fila][Pos[2].C].Posibilidades--;
U[7]=1;
*P=1;}
if (T[Fila][Pos[3].C].Posibles[N]==1){
T[Fila][Pos[3].C].Posibles[N]=0;
T[Fila][Pos[3].C].Posibilidades--;
U[7]=1;
*P=1;}
}}

for (Fila=1;Fila<=9;Fila++)
for(a=1;a<=6;a++)
for(b=a+1;b<=7;b++)
for(c=b+1;c<=8;c++)
for(d=c+1;d<=9;d++){
for(Col=1;Col<=9;Col++) Estan[Col]=0;
Pos[0].C=0;
for(Col=1;Col<=9;Col++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1)
||(T[Fila][Col].Posibles[c]==1)||
(T[Fila][Col].Posibles[d]==1))&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
if(T[Fila][Col].Posibles[c]==1) Estan[c]=1;
if(T[Fila][Col].Posibles[d]==1) Estan[d]=1;
Pos[0].C++;
Pos[Pos[0].C].C=Col;}
if ((Pos[0].C==4)&&(Estan[a]==1)&&(Estan[b]==1)&&
(Estan[c]==1)&&(Estan[d]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)&&(N!=c)&&(N!=d)){
if (T[Fila][Pos[1].C].Posibles[N]==1){
T[Fila][Pos[1].C].Posibles[N]=0;
T[Fila][Pos[1].C].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Fila][Pos[2].C].Posibles[N]==1){
T[Fila][Pos[2].C].Posibles[N]=0;
T[Fila][Pos[2].C].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Fila][Pos[3].C].Posibles[N]==1){
T[Fila][Pos[3].C].Posibles[N]=0;
T[Fila][Pos[3].C].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Fila][Pos[4].C].Posibles[N]==1){
T[Fila][Pos[4].C].Posibles[N]=0;
T[Fila][Pos[4].C].Posibilidades--;
U[8]=1;
*P=1;}
}}

for (Col=1;Col<=9;Col++)
for(a=1;a<=8;a++)
for(b=a+1;b<=9;b++){
for(Fila=1;Fila<=9;Fila++) Estan[Fila]=0;
Pos[0].F=0;
for(Fila=1;Fila<=9;Fila++)
   if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1))
&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
Pos[0].F++;
Pos[Pos[0].F].F=Fila;}
if ((Pos[0].F==2)&&(Estan[a]==1)&&(Estan[b]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)){
if (T[Pos[1].F][Col].Posibles[N]==1){
T[Pos[1].F][Col].Posibles[N]=0;
T[Pos[1].F][Col].Posibilidades--;
U[6]=1;
*P=1;}
if (T[Pos[2].F][Col].Posibles[N]==1){
T[Pos[2].F][Col].Posibles[N]=0;
T[Pos[2].F][Col].Posibilidades--;
U[6]=1;
*P=1;}
}}

for (Col=1;Col<=9;Col++)
for(a=1;a<=7;a++)
for(b=a+1;b<=8;b++)
for(c=b+1;c<=9;c++){
for(Fila=1;Fila<=9;Fila++) Estan[Fila]=0;
Pos[0].F=0;
for(Fila=1;Fila<=9;Fila++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1)
||(T[Fila][Col].Posibles[c]==1))&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
if(T[Fila][Col].Posibles[c]==1) Estan[c]=1;
Pos[0].F++;
Pos[Pos[0].F].F=Fila;}
if ((Pos[0].F==3)&&(Estan[a]==1)&&(Estan[b]==1)&&(Estan[c]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)&&(N!=c)){
if (T[Pos[1].F][Col].Posibles[N]==1){
T[Pos[1].F][Col].Posibles[N]=0;
T[Pos[1].F][Col].Posibilidades--;
U[7]=1;
*P=1;}
if (T[Pos[2].F][Col].Posibles[N]==1){
T[Pos[2].F][Col].Posibles[N]=0;
T[Pos[2].F][Col].Posibilidades--;
U[7]=1;
*P=1;}
if (T[Pos[3].F][Col].Posibles[N]==1){
T[Pos[3].F][Col].Posibles[N]=0;
T[Pos[3].F][Col].Posibilidades--;
U[7]=1;
*P=1;}
}}

for (Col=1;Col<=9;Col++)
for(a=1;a<=6;a++)
for(b=a+1;b<=7;b++)
for(c=b+1;c<=8;c++)
for(d=c+1;d<=9;d++) {
for(Fila=1;Fila<=9;Fila++) Estan[Fila]=0;
Pos[0].F=0;
for(Fila=1;Fila<=9;Fila++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1)
||(T[Fila][Col].Posibles[c]==1)||
(T[Fila][Col].Posibles[d]==1))&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
if(T[Fila][Col].Posibles[c]==1) Estan[c]=1;
if(T[Fila][Col].Posibles[d]==1) Estan[d]=1;
Pos[0].F++;
Pos[Pos[0].F].F=Fila;
}
if ((Pos[0].F==3)&&(Estan[a]==1)&&(Estan[b]==1)&&
(Estan[c]==1)&&(Estan[d]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)&&(N!=c)){
if (T[Pos[1].F][Col].Posibles[N]==1){
T[Pos[1].F][Col].Posibles[N]=0;
T[Pos[1].F][Col].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Pos[2].F][Col].Posibles[N]==1){
T[Pos[2].F][Col].Posibles[N]=0;
T[Pos[2].F][Col].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Pos[3].F][Col].Posibles[N]==1){
T[Pos[3].F][Col].Posibles[N]=0;
T[Pos[3].F][Col].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Pos[4].F][Col].Posibles[N]==1){
T[Pos[4].F][Col].Posibles[N]=0;
T[Pos[4].F][Col].Posibilidades--;
U[8]=1;
*P=1;}
}}

for (FilaR=1;FilaR<=3;FilaR++)
for (ColR=1;ColR<=3;ColR++)
for(a=1;a<=8;a++)
for(b=a+1;b<=9;b++){
for(Fila=1;Fila<=9;Fila++) Estan[Fila]=0;
Pos[0].F=0;
for(Fila=((3*FilaR)-2);Fila<=(3*FilaR);Fila++)
for(Col=((3*ColR)-2);Col<=(3*ColR);Col++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1))
&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
Pos[0].F++;
Pos[Pos[0].F].F=Fila;
Pos[Pos[0].F].C=Col;}
if ((Pos[0].F==2)&&(Estan[a]==1)&&(Estan[b]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)){
if (T[Pos[1].F][Pos[1].C].Posibles[N]==1){
T[Pos[1].F][Pos[1].C].Posibles[N]=0;
T[Pos[1].F][Pos[1].C].Posibilidades--;
U[6]=1;
*P=1;}
if (T[Pos[2].F][Pos[2].C].Posibles[N]==1){
T[Pos[2].F][Pos[2].C].Posibles[N]=0;
T[Pos[2].F][Pos[2].C].Posibilidades--;
U[6]=1;
*P=1;}
}}

for (FilaR=1;FilaR<=3;FilaR++)
for (ColR=1;ColR<=3;ColR++)
for(a=1;a<=7;a++)
for(b=a+1;b<=8;b++)
for(c=b+1;c<=9;c++){
for(Fila=1;Fila<=9;Fila++) Estan[Fila]=0;
Pos[0].F=0;
for(Fila=((3*FilaR)-2);Fila<=(3*FilaR);Fila++)
for(Col=((3*ColR)-2);Col<=(3*ColR);Col++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1)
||(T[Fila][Col].Posibles[c]==1))&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
if(T[Fila][Col].Posibles[c]==1) Estan[c]=1;
Pos[0].F++;
Pos[Pos[0].F].F=Fila;
Pos[Pos[0].F].C=Col;}
if ((Pos[0].F==3)&&(Estan[a]==1)&&(Estan[b]==1)&&(Estan[c]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)&&(N!=c)){
if (T[Pos[1].F][Pos[1].C].Posibles[N]==1){
T[Pos[1].F][Pos[1].C].Posibles[N]=0;
T[Pos[1].F][Pos[1].C].Posibilidades--;
U[7]=1;
*P=1;}
if (T[Pos[2].F][Pos[2].C].Posibles[N]==1){
T[Pos[2].F][Pos[2].C].Posibles[N]=0;
T[Pos[2].F][Pos[2].C].Posibilidades--;
U[7]=1;
*P=1;}
if (T[Pos[3].F][Pos[3].C].Posibles[N]==1){
T[Pos[3].F][Pos[3].C].Posibles[N]=0;
T[Pos[3].F][Pos[3].C].Posibilidades--;
U[7]=1;
*P=1;}
}}

for (FilaR=1;FilaR<=3;FilaR++)
for (ColR=1;ColR<=3;ColR++)
for(a=1;a<=6;a++)
for(b=a+1;b<=7;b++)
for(c=b+1;c<=8;c++)
for(d=c+1;d<=9;d++){
for(Fila=1;Fila<=9;Fila++) Estan[Fila]=0;
Pos[0].F=0;
for(Fila=((3*FilaR)-2);Fila<=(3*FilaR);Fila++)
for(Col=((3*ColR)-2);Col<=(3*ColR);Col++)
if(((T[Fila][Col].Posibles[a]==1)||(T[Fila][Col].Posibles[b]==1)
||(T[Fila][Col].Posibles[c]==1)||
(T[Fila][Col].Posibles[d]==1))&&(T[Fila][Col].HayNum!=1)){
if(T[Fila][Col].Posibles[a]==1) Estan[a]=1;
if(T[Fila][Col].Posibles[b]==1) Estan[b]=1;
if(T[Fila][Col].Posibles[c]==1) Estan[c]=1;
if(T[Fila][Col].Posibles[d]==1) Estan[d]=1;
Pos[0].F++;
Pos[Pos[0].F].F=Fila;
Pos[Pos[0].F].C=Col;}
if ((Pos[0].F==4)&&(Estan[a]==1)&&(Estan[b]==1)
&&(Estan[c]==1)&&(Estan[d]==1))
for(N=1;N<=9;N++)
if ((N!=a)&&(N!=b)&&(N!=c)&&(N!=d)){
if (T[Pos[1].F][Pos[1].C].Posibles[N]==1){
T[Pos[1].F][Pos[1].C].Posibles[N]=0;
T[Pos[1].F][Pos[1].C].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Pos[2].F][Pos[2].C].Posibles[N]==1){
T[Pos[2].F][Pos[2].C].Posibles[N]=0;
T[Pos[2].F][Pos[2].C].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Pos[3].F][Pos[3].C].Posibles[N]==1){
T[Pos[3].F][Pos[3].C].Posibles[N]=0;
T[Pos[3].F][Pos[3].C].Posibilidades--;
U[8]=1;
*P=1;}
if (T[Pos[4].F][Pos[4].C].Posibles[N]==1){
T[Pos[4].F][Pos[4].C].Posibles[N]=0;
T[Pos[4].F][Pos[4].C].Posibilidades--;
U[8]=1;
*P=1;}
}}}

void X_Wing(struct TpCasilla T[][10], int *P,int U[])
{
int Fil,Fil1,Fil2,Fil3,Col,Pos[10],Esta1,Esta2,Esta3,N;

for(Fil1=1;Fil1<=8;Fil1++)
for(Fil2=Fil1+1;Fil2<=9;Fil2++)
for(N=1;N<=9;N++){
Pos[0]=0; Esta1=Esta2=0;
for(Col=1;Col<=9;Col++){
if ((T[Fil1][Col].Posibles[N]==1)&&(T[Fil1][Col].HayNum==0))
Esta1=1;
if ((T[Fil2][Col].Posibles[N]==1)&&(T[Fil2][Col].HayNum==0))
Esta2=1;
if (((T[Fil1][Col].Posibles[N]==1)&&(T[Fil1][Col].HayNum==0))||
((T[Fil2][Col].Posibles[N]==1)&&(T[Fil2][Col].HayNum==0))){
Pos[0]++;
Pos[Pos[0]]=Col;}}
if((Pos[0]==2)&&(Esta1)&&(Esta2)){
for(Fil=1;Fil<=9;Fil++)
if((Fil!=Fil1)&&(Fil!=Fil2)){
if((T[Fil][Pos[1]].Posibles[N]==1)
&&(T[Fil][Pos[1]].HayNum==0)){
T[Fil][Pos[1]].Posibles[N]=0;
T[Fil][Pos[1]].Posibilidades--;
U[9]=1;
*P=1;}
if((T[Fil][Pos[2]].Posibles[N]==1)
&&(T[Fil][Pos[2]].HayNum==0)){
T[Fil][Pos[2]].Posibles[N]=0;
T[Fil][Pos[2]].Posibilidades--;
U[9]=1;
*P=1;}
}}}

for(Fil1=1;Fil1<=7;Fil1++)
for(Fil2=Fil1+1;Fil2<=8;Fil2++)
for(Fil3=Fil2+1;Fil3<=9;Fil3++)
for(N=1;N<=9;N++){
Pos[0]=0; Esta1=Esta2=Esta3=0;
for(Col=1;Col<=9;Col++){
if ((T[Fil1][Col].Posibles[N]==1)&&(T[Fil1][Col].HayNum==0))
Esta1=1;
if ((T[Fil2][Col].Posibles[N]==1)&&(T[Fil2][Col].HayNum==0))
Esta2=1;
if ((T[Fil3][Col].Posibles[N]==1)&&(T[Fil3][Col].HayNum==0))
Esta3=1;
if (((T[Fil1][Col].Posibles[N]==1)&&(T[Fil1][Col].HayNum==0))||
((T[Fil2][Col].Posibles[N]==1)&&(T[Fil2][Col].HayNum==0))||
((T[Fil3][Col].Posibles[N]==1)&&(T[Fil3][Col].HayNum==0))){
Pos[0]++;
Pos[Pos[0]]=Col;}}
if((Pos[0]==3)&&(Esta1)&&(Esta2)&&(Esta3)){
for(Fil=1;Fil<=9;Fil++)
if((Fil!=Fil1)&&(Fil!=Fil2)&&(Fil!=Fil3)){
if((T[Fil][Pos[1]].Posibles[N]==1)
&&(T[Fil][Pos[1]].HayNum==0)){
T[Fil][Pos[1]].Posibles[N]=0;
T[Fil][Pos[1]].Posibilidades--;
U[10]=1;
*P=1;}
if((T[Fil][Pos[2]].Posibles[N]==1)
&&(T[Fil][Pos[2]].HayNum==0)){
T[Fil][Pos[2]].Posibles[N]=0;
T[Fil][Pos[2]].Posibilidades--;
U[10]=1;
*P=1;}
if((T[Fil][Pos[3]].Posibles[N]==1)
&&(T[Fil][Pos[3]].HayNum==0)){
T[Fil][Pos[3]].Posibles[N]=0;
T[Fil][Pos[3]].Posibilidades--;
U[10]=1;
*P=1;}
}}}}

void InicializarDatos(struct TpCasilla T[][10])
{
int a,b,c;
for(a=1;a<=9;a++)
for(b=1;b<=9;b++){
T[a][b].HayNum=0;
T[a][b].Num=0;
T[a][b].Posibilidades=9;
for(c=1;c<=9;c++)
T[a][b].Posibles[c]=1;
}}

void LecturaDatos(struct TpCasilla T[][10])
{
FILE *FSud;
char NombreF[30],car;
int N,a,b,c;

printf("Escriba el nombre del fichero donde esta almacenado el Sudoku: ");
gets(NombreF);

if ((FSud=fopen(NombreF,"r"))==0){
printf("No se pudo abrir el fichero.");scanf("%c",&car);
exit(1);}

car=getc(FSud);
a=1;b=1;
printf("\n\nEl Sudoku del fichero es el siguiente: \n\n\n");
while (!feof(FSud)){
printf("%c",car);
N=car; N=N-48;
if((N>=0)&&(N<=9)){
T[b][a].Num=N;
if (T[b][a].Num!=0){
T[b][a].HayNum=1;
T[b][a].Posibilidades=0;
for (c=1;c<=9;c++)
T[b][a].Posibles[c]=0;
}
if(a==9) {a=0; b++;}
a++;}
car=getc(FSud);}
fclose(FSud);
scanf("%c",&car);}

void ImprimeDatos(struct TpCasilla T[][10])
{
int b,a,N;
printf("\n\n\n\n\nNumeros que pueden ir en cada casilla\n\n\n");
for(b=1;b<=9;b++){
for(a=1;a<=9;a++){
for(N=1;N<=9;N++)
printf(" %d:%d ",N,T[b][a].Posibles[N]);
printf("   ");}
printf("\n");}}

void ImprimeDatos2(struct TpCasilla T[][10])
{
int b,a;

printf("\nCANTIDAD DE POSIBILIDADES\n\n");
for(b=1;b<=9;b++){
for(a=1;a<=9;a++){
printf("%d",T[b][a].Posibilidades);
printf("   ");}
printf("\n");}
printf("\n\n");}

void ImprimeDatos3(struct TpCasilla T[][10])
{
int b,a;

for(b=1;b<=9;b++){
for(a=1;a<=9;a++){
printf("%d",T[b][a].HayNum);
printf("   ");}
printf("\n");}}

void ImprimeDatos4(struct TpCasilla T[][10])
{
int b,a;

printf("\nSUDOKU\n\n");
for(b=1;b<=9;b++){
for(a=1;a<=9;a++){
printf("%d",T[b][a].Num);
if ((a%3)==0) printf(" ");}
printf("\n");
if ((b%3)==0) printf("\n");}
printf("\n\n");}


Si no los funciona, les da algun problema, resuelve algun sudoku mal, o directamente no lo resuelve, diganmelo. De momento no he encontrado ningun sudoku que se le resista (¡¡Siempre y cuando se pueda resolver por logica!!)

Un saludo y espero que les guste!!


Título: Re: C/C++ RESOLVER SUDOKU
Publicado por: Simon94 en 10 Enero 2013, 00:07 am
Me quedan dudas con las funciones que utiliza (Tambien mire el sitio que puso) no acabe de entender la logica del xwing (aunque no es lo que mas me importe). Lo que de verdad me importa es el procedure que sigue, las distintas funciones para sacar numeros se van ejecutando una detras de otra, independientemente de si sacan numero o como va?
Me gustaria implementar este mismo programa pero en Java y tambien con un entorno gráfico para que sea mas manejable.

Buenas tardes y espero su respuesta


Título: Re: C/C++ RESOLVER SUDOKU
Publicado por: arts en 10 Enero 2013, 00:27 am
Wo0w que caña, igual me apunto e intento hacerlo en visual basic que voy a empezar dentro de poco, me parece increible el algoritmo. Aunque no entiendo casi nada xDDD, yo pensaba que era mucho mas corto el código que valdría con un simple recorrido de filas y columnas y luego preguntar las restricciones generando un nº aleatorio que cumpla las 3 condiciones, pero esto me ha parecido increible.  ;-)


Título: Re: C/C++ RESOLVER SUDOKU
Publicado por: Simon94 en 10 Enero 2013, 20:38 pm
Si q se podria resolvr asi, pero lo que yo quiero es mediante logica, igual que lo hace una prsona, y no con prueba y error. ¿Alguien sabe de algun programa que este mejor explicado que este y que lo solucione con logica?

Simon.


Título: Re: C/C++ RESOLVER SUDOKU
Publicado por: cypascal en 13 Enero 2013, 13:53 pm
Yo creo que en el enlace queda más o menos claro que métodos se aplica. Yo no he encontrado ningún otro sitio donde esté el problema de los sudokus resuelto con lógica, ni en C ni en ningún otro lenguaje.

Salu10.