#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char far*q,far*Q[81]={(char far*)0xA0000000};
char C[81],N[27][10],D[]=" 123456789";
char E,b[81],m[81],n[81],o[81];
char B[][9]={"5.2......",
"....6.9..",
".........",
".41..7...",
"...5...6.",
"..5..2...",
".97.85...",
".......35",
".54....96"};
int i[225],g[3],X[81],Y[81];;
int a,d,f,x,y,c=80;
void Cifra(F){
gotoxy(X[c],Y[c]);
printf("%c",F);
}
void Cursor(F){
for(d=225;d--;)
if(*(q=Q[c]+i[d])==F) *q=!F;
if(x) N[m[c]][a]=N[n[c]][a]=N[o[c]][a]=!F;
}
int main(){
_AX=0x13;
geninterrupt(0x10);
time_t t;
for(d=225;d--;i[d]=d/15*320+d%15+321);
do{
m[c]=c/27*9+c%27/9*3;
n[c]=c%9/3*9+c%3*3+1;
o[c]=c/27*9+c%9/3*3+2;
X[c]=c%9*2+12;
Y[c]=c/9*2+4;
Q[c]=Q[0]+8*X[c]+2560*Y[c]-3853;
if(b[c]=B[c/9][c%9]-46) Cifra(D[b[c]-=2]);
for(f=144,a=3;a--;f/=3)
if(c%27/9+c%3<1&&a==1||!a+!c)
for(q=Q[c]-321*a,d=a+1;d--;)
for(x=y=d+f,y++;y--;)
*(q+y)=*(q+320*y)=*(q+320*x+y)=*(q+320*y+x)=7;
}while(c--);
Inicio:
g[0]=g[1]=g[2]=E=c=f=x=0;
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;
Cursor(0);
if(E>47&&E<58) Cifra(D[b[c]=E-48]),
E=77;
else while(!(E=getch()));
Cursor(1);
}while(E!=13);
for(x=c=81;c--;)
if(a=b[c]) y=N[m[c]][a]+N[n[c]][a]+N[o[c]][a]?0:1,
Cifra(D[a=b[c]*=y]),
f+=y,
g[c/27]+=y,
Cursor(!y);
do{
for(a=y=2;y--;a=g[a]>g[y]?y:a);
for(g[a]=d=27;d--;)
if(!b[c=27*a+d]) C[--x]=c;
}while(x>f);
t=time(NULL)-1;
while(f>=x)
if(f>80){
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--;
}
else{
if(a=b[c=C[f]]) N[m[c]][a]=N[n[c]][a]=N[o[c]][a]=0;
Rutina:
if(++a>9) a=!f--;
else if(!N[m[c]][a]&&!N[n[c]][a]&&!N[o[c]][a])
f+=N[m[c]][a]=N[n[c]][a]=N[o[c]][a]=1;
else goto Rutina;
Cifra(D[b[c]=a]);
}
for(x=c=81;c--;)
if(a=b[c]) Cursor(1);
goto Inicio;
}