#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char b[][9]={"5.2......",
"....6.9..",
".........",
".41..7...",
"...5...6.",
"..5..2...",
".97.85...",
".......35",
".54....96"};
char far*Q,far*q=(char far*)0xA0000000-3516;
char E,A[]=" 123456789";
int G[3],B[81],C[81],X[81],Y[81];
int D[81],H[81],J[81],N[271];
int a,v,w,x,y,c=80;
void Cifra(char F){
gotoxy(X[c],Y[c]);
printf("%c",F);
}
void Cursor(F){
if(a) N[D[c]+a]=N[H[c]+a]=N[J[c]+a]=!F;
Q=q+2560*Y[c]+8*X[c];
for(v=15;v--;Q+=305)
for(w=15;w--;*Q++=*Q==F?!F:*Q);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
time_t T;
do{
D[c]=(c/27*9+c%27/9*3)*10;
H[c]=(c%9/3*9+c%3*3+1)*10;
J[c]=(c/27*9+c%9/3*3+2)*10;
X[c]=c%9*2+12;
Y[c]=c/9*2+4;
Q=q+2560*Y[c]+8*X[c]-321;
for(w=16,a=3;a--;w*=3,Q-=321)
if(!c||a>1||c%27/9+c%3<a)
for(v=w+3-a+!a,w+=3*!a;v--;)
*(Q+v)=*(Q+v+320*w)=*(Q+320*v)=*(Q+320*v+w)=7;
if(B[c]=b[c/9][c%9]-46) Cifra(A[B[c]-=2]);
}while(c--);
Inicio:
G[0]=G[1]=G[2]=E=a=c=y=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<48||E>57) while(!(E=getch()));
else Cifra(A[B[c]=E-48]),
E=77;
Cursor(1);
}while(E!=13);
for(x=c=81;c--;)
if(a=B[c]) y+=v=N[D[c]+a]+N[H[c]+a]+N[J[c]+a]<1,
G[c/27]+=v,
Cifra(A[B[c]=a*=v]),
Cursor(!v);
while(x>y){
for(a=v=2;v--;a=G[a]>G[v]?v:a);
for(G[a]=w=27;w--;)
if(!B[c=27*a+w]) C[--x]=c;
}
T=time(NULL)-1;
while(y>=x)
if(y>80){
printf("%c[23;11f%d",27,time(NULL)-T);
printf("%c Pulse una tecla\r",34);
while(kbhit()) getch();
if(getch()==27) return 0;
printf("%c[2K",27);
y--;
}
else{
if(a=B[c=C[y]]) N[D[c]+a]=N[H[c]+a]=N[J[c]+a]=0;
while(N[++a+D[c]]||N[H[c]+a]||N[J[c]+a]);
Cifra(A[B[c]=a%=10]);
y+=a?N[D[c]+a]=N[H[c]+a]=N[J[c]+a]=1:-1;
}
for(c=81;c--;) if(a=B[c]) Cursor(1);
goto Inicio;
}