#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
int main()
{
time_t t1,t2;
_AX=0x13;
geninterrupt(0x10);
char far*p=(char far*)0xA0000000L;
char E,D[]=" 123456789 ";
int a,c,c1,c2,c3,c4,X,Y,A;
int b[82],x[82],y[82];
int n[244],n1[82],n2[82],n3[82];
int C[82],f[3],g[3];
int e[]={16,
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};
Inicio:
for(c=c1=0;c1<3;c1++)
for(g[f[c1]=c1]=c2=0;c2<3;c2++)
for(c3=-1;++c3<3;)
for(c4=-1;++c4<3;){x[c+1]=12+c%9*2;
y[c+1]=4+c/9*2;
a=b[++c]=n[c]=n[c+81]=n[c+162]=0;
X=8*x[c]+2560*y[c]-4173;
if(A=e[0]){n1[c]=27*c1+9*c2;
n2[c]=27*c3+9*c4+81;
n3[c]=27*c1+9*c3+162;
gotoxy(x[c],y[c]);
printf("%c",D[e[c]]);
while(a<3){for(Y=-1;Y++<A+(a==1);){*(p+X+Y)=7;
*(p+X+320*Y)=7;
*(p+X+Y+320*A)=7;
*(p+X+320*Y+A)=7;
}
if(c2+c4||(c1+c3)*a) break;
A=3*(A+a++);
X-=321;
}
}
else if(e[c])
for(Y=16;--Y;) for(A=16;--A;)
if(*(p+X+320*Y+A)<2) *(p+X+320*Y+A)=0;
}
E=c=1;
while(E-13){X=8*x[c]+2560*y[c]-4173;
for(Y=16;--Y;) for(A=16;--A;)
if(*(p+X+320*Y+A)<1) *(p+X+320*Y+A)=1;
if(E>47&&E<58){gotoxy(x[c],y[c]);
printf("%c",D[e[c]=E-48]);
E=77;
}
else while((E=getch())<1);
if(E==27) return 0;
for(Y=16;--Y;) for(A=16;--A;)
if(*(p+X+320*Y+A)<2) *(p+X+320*Y+A)=0;
c+=(E==77&&c<81);
c-=(E==75&&c>1);
c+=9*(E==80&&c<73);
c-=9*(E==72&&c>9);
if(E==32) E=48;
}
for(c=82;--c;){gotoxy(x[c],y[c]);
if(a=e[c])
if(n[n1[c]+a]+n[n2[c]+a]+n[n3[c]+a])
printf("%c",D[e[c]=0]);
else{b[c]=n[n1[c]+a]=n[n2[c]+a]=n[n3[c]+a]=1;
g[(c-1)/27]+=1;
X=8*x[c]+2560*y[c]-4173;
for(Y=16;--Y;) for(A=16;--A;)
if(*(p+X+320*Y+A)<1) *(p+X+320*Y+A)=1;
}
}
while(++c<3)
if(g[f[c]]>g[f[c-1]]){c1=f[c-1];
f[c-1]=f[c];
f[c]=c1;
c=2-c;
}
for(e[0]=c1=c3=0;c1<3;c1++)
for(c2=0;++c2<28;)
if(b[c=27*f[c1]+c2]<1) C[++c3]=c;
c1=++c3>1;
t1=time(NULL);
while(c1){if(c1<c3){if(a=e[c=C[c1]])
n[n1[c]+a]=n[n2[c]+a]=n[n3[c]+a]=0;
while(++a<10){if(n[n1[c]+a]) continue;
if(n[n3[c]+a]) continue;
if(n[n2[c]+a]) continue;
n[n1[c]+a]=n[n2[c]+a]=n[n3[c]+a]=1;
e[C[c1++]]=a;
break;
}
gotoxy(x[c],y[c]);
printf("%c",D[a]);
if(a>9) e[C[c1--]]=0;
}
else{t2=time(NULL);
gotoxy(11,23);
printf("%.f\" ",difftime(t2+1,t1));
printf("Pulse ESPACIO\r");
while((E=getch())-32)
if(E==27) return 0;
printf("\t\t\t\t\t\r");
c1--;
}
}
goto Inicio;
}