#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char A[][40]={
"0000000000000000000000000000000000000000",
"00000000000000000000;0000000000000000000",
"00000000000000000000:0000000000000000000",
"004::1004::::1000000:0000004:::8:::::100",
"00:00:00:0000:000000:000000:000:00000:00",
"00:00:00:0000:000000:000000:000:00000:00",
"00:00:00:0000:000000:000000:000:00000:00",
"00:00:00:0000:000000:000000:000:00000:00",
"00:007::20000:000000:000000:000:00000:00",
"00:00:0000000:000000:000000:000:00000:00",
"00:00:0000000:000000:000000:000:00000:00",
"00:00:0000000:000000:000000:000:00000:00",
"00:00:0000000:000000:000000:000:00000:00",
"00:00:0000000:000000:000000:000:00000:00",
"00:003::8::::9::::::9::::::6:::9:::::500",
"00:00000:0000:000000:0000000000:00000:00",
"00:00000:0000:000000:0000000000:00000:00",
"00:00000:0000:000000:0000000000:00000:00",
"00:00000:0000:000000:0000000000:00000:00",
"00:00000:0000:000000:0000000000:00000:00",
"00:004::500007::8:::6::::1004::500000:00",
"00:00:00:0000:00:00000000:00:00:00000:00",
"00:00:00:0000:00:00000000:00:00:00000:00",
"00:00:00:0000:00:00000000:00:00:00000:00",
"00:00:00:0000:00:004::100:00:00:00000:00",
"00:00:00:0000:00:00:00:00:00:00:00000:00",
"00:00:00:0000:00:00:00:00:00:00:00000:00",
"00:00:00:0000:00:00:00:00:00:00:00000:00",
"007::2007::::200:00:00:007::2007:::::200",
"00:00000:0000000:00:00:00:00000:00000000",
"00:00000:0000000:00:00:00:00000:00000000",
"00:00000:0000000:00:003::200000:00000000"};
char Pieza[][4][13]={
"0000111110000","0000111110000","0000111110000","0000111110000",
"0011111111100","0011111111100","0011111111100","0011111111100",
"0111117111110","0111111111110","0113311133110","0112211122110",
"0111117111110","0111111117770","0123321233210","0144331443310",
"1111177711111","1111117777777","0124421244210","0144331443310",
"1111177711111","1117777777777","1114411144111","1112211122111",
"1111777771111","1111117777777","1111111111111","1111111111111",
"0111777771110","0111111117770","1111111111111","1111111111111",
"0117777777110","0111111111110","1111111111111","1111111111111",
"0017777777100","0011111111100","1101100011011","0111011101110",
"0000777770000","0000111110000","1000100010001","0010001000100"};
char far*Q[616],far*q=(char far*)0xA0000000;
int J[2560],B[2560],b[13],p[20];
int X[616],Y[616],P[20][143];
int e[256]={0,72,77,80,75};
int G[]={0,2,1,4,3,5,8,7,6,9,10,12};
int H[][4]={1,0,0,-1,3,1,0,0,0,-1,1,0,0,0,-1,-3};
int I[]={0,-64,1,64,-1};
int C[]={1309,1311,1313,1315};
int D[]={3,1,1,3};
int c=2559,g=61591,n=5,w=3200;
int E,L,M,a,d,h,j,v,x,y;
void Figura(char far*F,char F1,char F2){
for(v=p[F1];v--;*(F+P[F1][v])=F2);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
textcolor(BLUE);
clrscr();
clock_t T;
b[12]-=b[11]=61;
while(e[e[--n]]=n) e[n]=0;
for(y=11;y--;v+=320,w-=320)
for(x=13;x--;)
for(n=4;n--;)
if(a=Pieza[y][n][x]-48)
if(!n) P[0][p[0]++]=P[a][p[a]++]=v+x,
P[a+2][p[a+2]++]=w+x;
else if(n<2) P[a+1][p[a+1]++]=v+x,
P[a+3][p[a+3]++]=v+12-x;
else if(a<2) P[n+3][p[n+3]++]=w+x;
else{
if(a!=3) P[n+9][p[n+9]++]=w+x;
if(a!=4) P[n+11][p[n+11]++]=w+x;
}
for(y=40;y--;g-=1440)
for(h=g+5,d=c-=x=32;x--;g-=5,h+=5)
if(B[++d]=G[B[c--]=A[x][39-y]-48])
Q[J[c+1]=j]=q+g,
Q[J[d]=j+1]=q+h,
Y[j]=Y[j+1]=y,
X[j++]=x,
X[j++]=63-x;
while(j--) for(q=Q[j]-1,y=11;y--;q+=305)
for(x=15;x--;*q++=0);
j=J[c=2008];
Inicio:
T=clock();
w=!w;
for(n=4;n--;D[n]=d)
if(C[n]==c) break;
else{
a=B[h=C[n]];
d=D[n];
Figura(Q[g=J[h]],5+!w,0);
Figura(Q[g],d+11,0);
if(a<10)
if(a<5) d+=H[a-1][d];
else{
if(x=X[j]-X[g]) if(x%2&&n%2) x=-x;
if(y=Y[j]-Y[g]) if(y%2&&n>1) y=-y;
if(a==5) if(d==0) d=x>0?1:3;
else if(y>0) d=2;
if(a==6) if(d==1) d=y>0?2:0;
else if(x<0) d=3;
if(a==7) if(d==2) d=x>0?1:3;
else if(y<0) d=0;
if(a==8) if(d==3) d=y>0?2:0;
else if(x>0) d=1;
if(a==9) if(x&&d%2==0) d=x>0?1:3;
else if(y&&d%2) d=y>0?2:0;
}
h+=b[B[h+=I[d+1]]];
Figura(Q[J[C[n]=h]],5+w,n+2);
Figura(Q[J[h]],d+11,15);
}
while(clock()-T<3);
if(E) Figura(Q[j],e[E]+6,14);
while(clock()-T<4);
while(kbhit()) M=E=getch();
if(E==27&&getch()==E) return 0;
E=M;
do{
h=d=c+I[e[E]];
if(!B[d+=b[B[h]]]) E=h=E!=L?L:0;
else Figura(Q[j],h=0,0),
Figura(Q[j=J[c=d]],e[L=E],14);
}while(h);
goto Inicio;
}