#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char A[][50]={
"00000000000000000000000000000000000000000000000000",
"00000000000000000000000000;00000000000000000000000",
"00000000000000000000000000:00000000000000000000000",
"00D:J:A000D::Z::A000000000:000000000D:J:H::Z::A000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00J000J000J00000J000000000:000000000J000J00000J000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00J000G:J:B00000J000000000:000000000J000J00000J000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00J000J000000000J000000000:000000000J000J00000J000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00J000C:J:H:J:J:I:J:J:J:J:I:J:J:J:J:F:J:I:J:J:E000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00J0000000J00000J000000000:0000000000000J00000J000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00J000D:J:E00000G:::8:::::6:::::1000D:J:E00000J000",
"00:000:000:00000:000:00000000000:000:000:00000:000",
"00:000:000:00000:000:00000000000:000:000:00000:000",
"00J000J000J00000J000:00000000000:000J000J00000J000",
"00:000:000:00000:000:0004:::1000:000:000:00000:000",
"00:000:000:00000:000:000:000:000:000:000:00000:000",
"00G:J:B000G:J:J:B000:000:000:0007:::B000G:J:J:B000",
"00:0000000:000000000:000:000:000:0000000:000000000",
"00:0000000:000000000:000:000:000:0000000:000000000",
"00J0000000J000000000:000:000:000:0000000J000000000",
"00:0000000:000000000:000:0003:::20000000:000000000"};
char Pieza[][5][13]={
"0000111110000","0000111110000","0000111110000","0000111110000","0000000000000",
"0011111111100","0011111111100","0011111111100","0011111111100","0000000000000",
"0111117111110","0111111111110","0113311133110","0112211122110","0000222220000",
"0111117111110","0111111117770","0123321233210","0144331443310","0002222222000",
"1111177711111","1111117777777","0124421244210","0144331443310","0022211122200",
"1111177711111","1117777777777","1114411144111","1112211122111","0022111112200",
"1111777771111","1111117777777","1111111111111","1111111111111","0022211122200",
"0111777771110","0111111117770","1111111111111","1111111111111","0002222222000",
"0117777777110","0111111111110","1111111111111","1111111111111","0000222220000",
"0017777777100","0011111111100","1101100011011","0111011101110","0000000000000",
"0000777770000","0000111110000","1000100010001","0010001000100","0000000000000"};
char far*Q[700],far*q=(char far*)0xA0000000;
int J[3200],B[3200],b[13];
int K[700],X[700],Y[700];
int P[20][143],p[20];
int C[]={1371,1380,1627,1636};
int D[]={3,1,3,1};
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 e[256]={0,72,77,80,75};
int i[]={0,3,4,1,2};
int c=3199,g=61271,j=1,n=5,w=3200;
int E,L,M,a,d,h,v,x,y;
void Figura(char far*F,char F1,char F2){
for(v=p[F1];v--;*(F+P[F1][v])=F2);
}
void Pildora(F,F1){
if(K[a=J[F+=v=I[i[F1]]]]>0||K[a=J[F+v]]>1)
Figura(Q[a],14+K[a],7);
}
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=5;n--;)
if(a=Pieza[y][n][x]-48)
switch(n){
case 0:
P[0][p[0]++]=P[a][p[a]++]=v+x;
P[a+2][p[a+2]++]=w+x;
break;
case 1:
P[a+1][p[a+1]++]=v+x;
P[a+3][p[a+3]++]=v+12-x;
break;
case 4:
if(a<2) P[15][p[15]++]=w+x;
P[16][p[16]++]=w+x;
break;
default:
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=50;y--;g-=1120)
for(h=g+5,d=c-=x=32;x--;c--,d++,g-=5,h+=5)
if(a=A[x][49-y]-48)
B[d+1]=G[B[c]=a%16],
K[j]=K[j+1]=a/16,
Q[J[c]=j]=q+g,
Q[J[d+1]=j+1]=q+h,
Y[j]=Y[j+1]=y,
X[j++]=x,
X[j++]=63-x;
for(c=3200;c--;)
if(j=J[c]){
for(q=Q[j]-1,y=11;y--;q+=305)
for(x=15;x--;*q++-=*q==1);
if(a=K[j])
if(a>0)
for(Figura(Q[j],14+a,7),d=5;--d;)
if(J[n=c+I[d]]) K[J[n]]--,
K[J[n+I[d]]]-=a-1;
}
Figura(Q[j=J[c=2514]],0,14);
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(j%2&&n%2) x=-x;
if(y=Y[j]-Y[g]) if(j%2<1&&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;
}
if(K[g]<0) Pildora(h,d+1);
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=g=c+I[e[E]];
if(!B[h+=b[B[g]]]||c==h) E=g=E!=L?L:0;
else{
Figura(Q[j],g=0,0);
if(K[j]<0) Pildora(c,e[E]);
Figura(Q[j=J[c=h]],e[L=E],14);
}
}while(g);
if(a=K[j])
if(a>0) for(K[j]=0,d=5;--d;)
if(J[n=c+I[d]]) K[J[n]]++,
K[J[n+I[d]]]+=a-1;
goto Inicio;
}