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