#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
int g[3],N[27][9];
int main()
{
_AX=0x13;
geninterrupt(0x10);
time_t t;
char far*Q=(char far*)0xA0000000;
char E,D[]="987654321 ";
int b[]={5,0,2,0,0,0,0,0,0,
0,0,0,0,6,0,9,0,0,
0,0,0,0,0,0,0,0,0,
0,4,1,0,0,7,0,0,0,
0,0,0,5,0,0,0,6,0,
0,0,5,0,0,2,0,0,0,
0,9,7,0,8,5,0,0,0,
0,0,0,0,0,0,0,3,5,
0,5,4,0,0,0,0,9,6};
int e[225],i[81],n[3][81];
int C[81],X[81],Y[81];
int a,f,h,x,y,c=80,d=225;
while(d--) e[d]=d/15*320+d%15+321;
do{
X[c]=12+c%9*2;
Y[c]=4+c/9*2;
gotoxy(X[c],Y[c]);
printf("%c",D[b[c]=9-b[c]]);
n[0][c]=c/27*9+c%27/9*3;
n[1][c]=c%9/3*9+c%3*3+1;
n[2][c]=c/27*9+c%9/3*3+2;
i[c]=x=8*X[c]+2560*Y[c]-4173;
E=1+!c+!(c%27/9+c%3);
f=16;
for(a=0;a<E;a++,f*=3,x-=321)
for(d=0;d<=a;d++)
for(h=f+d,y=0;y<=h;y++)
*(Q+x+y)=*(Q+x+320*y)=*(Q+x+y+320*h)=*(Q+x+320*y+h)=7;
}while(c--);
Inicio:
while(E=c=kbhit()) getch();
do{
c+=E==77&&c<80;
c-=E==75&&c>0;
c+=9*(E==80&&c<72);
c-=9*(E==72&&c>8);
if(E==32) E=48;
for(d=225;d--;)
*(Q+i[c]+e[d])+=!*(Q+i[c]+e[d]);
if(E>47&&E<58){
gotoxy(X[c],Y[c]);
printf("%c",D[b[c]=57-E]);
E=77;
}
else while(!(E=getch()));
if(E==27) return 0;
for(d=225;d--;)
*(Q+i[c]+e[d])-=*(Q+i[c]+e[d])==1;
}while(E!=13);
for(h=c=81;c--;)
if(b[c]<9){
gotoxy(X[c],Y[c]);
for(y=3;y--;)
if(N[n[y][c]][b[c]]) break;
if(y<0){
h--;
g[c/27]++;
for(y=3;y--;)
N[n[y][c]][b[c]]=1;
for(d=225;d--;)
*(Q+i[c]+e[d])+=!*(Q+i[c]+e[d]);
}
else printf("%c",D[b[c]=9]);
}
if(f=h) do{
for(x=y=2;y--;)
if(g[y]<g[x]) x=y;
for(g[x]=d=27;d--;)
if(b[c=27*x+d]>8) C[--f]=c;
}while(f);
t=time(NULL);
while(f+1)
if(f<h){
a=b[c=C[f]];
if(a<9) for(y=3;y--;)
N[n[y][c]][a]=0;
do for(y=a--?3:0;y--;)
if(N[n[y][c]][a]) break;
while(y+1);
if(a<0) a=b[C[f--]]=9;
else for(b[c]=a,f++,y=3;y--;)
N[n[y][c]][a]=1;
gotoxy(X[c],Y[c]);
printf("%c",D[a]);
}
else{
gotoxy(11,23);
printf("%.f%c ",difftime(time(NULL)+1,t),34);
printf("Pulse una tecla\r");
while(kbhit()) getch();
if(getch()==27) return 0;
printf("%c[2K",27);
f--;
}
for(c=81;c--;)
if(b[c]<9){
for(y=3;y--;g[y]=0)
N[n[y][c]][b[c]]=0;
for(d=225;d--;)
*(Q+i[c]+e[d])-=*(Q+i[c]+e[d])==1;
}
goto Inicio;
}