#include<stdio.h>
#include<conio.h>
#include<graphics.h>
int main()
{
int gdriver=1,gmode;
initgraph(&gdriver,&gmode,"");
setcolor(3);
setbkcolor(0);
cleardevice();
rectangle(81,17,226,162);
rectangle(81,17,228,164);
int A,c,c1,c2,c3,c4;
int b[83],x[82],y[82];
int n[244],n1[82],n2[82],n3[82];
char E=0,D[]=" 123456789 ";
int a[]={0,
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};
b[0]=b[82]=c=0;
for(c1=-1;++c1<3;) for(c2=-1;++c2<3;)
for(c3=-1;++c3<3;) for(c4=-1;++c4<3;)
{n1[c+1]=27*c1 +9*c2;
n2[c+1]=27*c3 +9*c4 +81;
n3[c+1]=27*c1 +9*c3 +162;
x[c+1]=12+c%9*2;
y[c+1]= 4+c/9*2;
n[++c]=n[c+81]=n[c+162]=0;
rectangle(8*x[c]-13,8*y[c]-13,8*x[c]+3,8*y[c]+3);
if(c2+c4<1) rectangle(8*x[c]-14,8*y[c]-14,8*x[c]+35,8*y[c]+35);
}
c=1;
while(E-13) {gotoxy(x[c],y[c]);
printf("%c",D[a[c]]);
setcolor(1);
rectangle(8*x[c]-11,8*y[c]-11,8*x[c],8*y[c]);
if(E>47 && E<58) E=77;
else E=0;
while(E<1) E=getch();
setcolor(0);
rectangle(8*x[c]-11,8*y[c]-11,8*x[c],8*y[c]);
if(E==27) return 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;
if(E>47 && E<59) a[c]=E-48;
}
for(c=0;++c<82;){A=a[c];
b[c]=0;
if(A)
if(n[n1[c]+A]+n[n2[c]+A]+n[n3[c]+A]) a[c]=0;
else {n[n1[c]+A]=n[n2[c]+A]=n[n3[c]+A]=++b[c];
setcolor(1);
rectangle(8*x[c]-11,8*y[c]-11,8*x[c],8*y[c]);
}
gotoxy(x[c],y[c]);
printf("%c",D[a[c]]);
}
c=1;
while(c){while(b[c]) c++;
if(c>81){gotoxy(14,23);
printf("Pulse ESPACIO");
while((E=getch())-32) if(E==27) return 0;
while(b[--c]);
}
else {A=a[c];
if(A) n[n1[c]+A]=n[n2[c]+A]=--n[n3[c]+A];
while(++A<10) {if(n[n1[c]+A]) continue;
if(n[n2[c]+A]) continue;
if(n[n3[c]+A]) continue;
n[n1[c]+A]=n[n2[c]+A]=++n[n3[c]+A];
gotoxy(x[c],y[c]);
a[c++]=A;
break;
}
if(A>9){a[c]=0;
gotoxy(x[c],y[c]);
while(b[--c]);
}
printf("%c",D[A]);
}
}
return 0;
}