#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][15]={
"000001111100000","000001111100000","000001111100000","000011111110000",
"000111111111000","000111111111000","000111111111000","000111111111000",
"001111111111100","001111111111100","001111111111100","001111111111100",
"001111111111100","001111101111100","001111111100000","001100111001100",
"011111111111110","011111000111110","011111100000000","001100111001100",
"011111111111110","011111000111110","011100000000000","011111111111110",
"011111111111110","011110000011110","011111100000000","011111111111110",
"001111111111100","001110000011100","001111111100000","011111111111110",
"001111111111100","001100000001100","001111111111100","011111111111110",
"000111111111000","000100000001000","000111111111000","011101111101110",
"000001111100000","000000000000000","000001111100000","001100111001100"};
char far*q=(char far*)0xA0000000;
int J[2560],B[2560],b[13];
int Q[616],X[616],Y[616];
int P[7][165],p[7];
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=2008,d=2559,g=61590,n=5;
int E,L,M,a,h,v,w,x,y;
void Figura(F,F1,F2){
for(v=p[F1];v--;*(q+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(n=5;n--;v=0)
for(y=11;y--;v+=320)
for(x=15;x--;)
if(n>3) P[6][p[6]++]=v+x;
else if(Pieza[y][n][x]==48) continue;
else{
if(n<3) P[n][p[n]++]=v+x;
if(n%2) P[n+2][p[n+2]++]=320*y+x;
if(n==2) P[4][p[4]++]=v+14-x;
}
for(y=40;y--;g-=1440)
for(h=g+5,n=d-=x=32;x--;g-=5,h+=5)
if(B[++n]=G[B[d--]=A[x][39-y]-48])
Figura(Q[J[d+1]=a]=g,6,0),
Figura(Q[J[n]=a+1]=h,6,0),
Y[a]=Y[a+1]=y,
X[a++]=x,
X[a++]=63-x;
Inicio:
T=clock();
for(a=4;a--;D[a]=d)
if(C[a]==c) break;
else{
n=B[h=C[a]];
d=D[a];
if(n<10)
if(n<5) d+=H[n-1][d];
else{
if(x=X[J[c]]-X[J[h]]) x*=x%2&&a%2?-1:1;
if(y=Y[J[c]]-Y[J[h]]) y*=y%2&&a>1?-1:1;
if(n==5) if(d==0) d=x>0?1:3;
else if(y>0) d=2;
if(n==6) if(d==1) d=y>0?2:0;
else if(x<0) d=3;
if(n==7) if(d==2) d=x>0?1:3;
else if(y<0) d=0;
if(n==8) if(d==3) d=y>0?2:0;
else if(x>0) d=1;
if(n==9) if(x&&d%2==0) d=x>0?1:3;
else if(y&&d%2) d=y>0?2:0;
}
Figura(Q[J[h]],5,0);
h+=b[B[h+=I[d+1]]];
Figura(Q[J[C[a]=h]],5,a+2);
}
while(clock()-T<3);
Figura(Q[J[c]],0,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]]]) h=E!=L?E=L:0;
else Figura(Q[J[c]],h=0,0),
Figura(Q[J[c=d]],e[L=E],14);
}while(h);
goto Inicio;
}