main(argc,argv)
int argc;
char *argv[];
{
int a,c,e,f,g,i,j,k,q,r,s,t,u,v;
int d[4],h[4],m[4],n[10000],o[4],o2[4],p[4],z[5000],w[4];
char x,y;
if (argc == 1) {
printf("syntax error\n");
exit();
}
if (argc != 3) {
printf("length error\n");
exit();
}
r=fii(argv[1])*vi(argv[1]);
c=fii(argv[2])*vi(argv[2]);
if (r*c == 0) {
printf("domain error\n");
exit();
}
i=r*c;
e=j=v=0;
for(s=0; s<i; ++s) z[s]=0;
for(s=0; s<i+i; ++s) n[s]=0;
o2[3]=z[0]=u=2;
z[n[1]=i-1]=24;
for(s=0; s<4; ++s) o[s]=1<<s;
o2[0]=4;
o2[1]=8;
o2[2]=1;
m[0]=1;
m[1]=(-c);
m[2]=(-1);
m[3]=c;
goto lb;
la:
s=1+roll(k);
t=0;
for(a=0; a<4; ++a) {
t+=p[a]&&h[a];
if(s==t) break;
}
q=z[e=d[a]];
j=(q>j)?q:j;
z[g]=o[a]+f;
z[e]=o2[a]+q+(j||f<16 ?0:16);
if (k!=1) n[u++]=e;
lb:
for(s=k=0; s<4; ++s) {
t=d[s]=e+m[s];
if (t<0 || t>=i) h[s]=0;
else {
switch (s) {
case 0:
case 2:
h[s]=(t/c == e/c)?1:0;
break;
case 1:
case 3:
h[s]=1;
}
f=z[e];
t=z[t];
k+=p[s]=h[s]&&(t==0||j<(f<16!=t<16));
}
}
g=e;
if (k!=0) goto la;
if (u==v) goto lc;
e=n[v++];
goto lb;
lc:
printf(" ");
for(s=2; s<=c; ++s) printf(" _");
printf("\n");
for(s=0; s<r; ++s) {
for (t=0; t<c; ++t) {
u=z[t+s*c];
v=u/4;
x=(v==(2*(v/2)))?'|':' ';
v=u/8;
y=(v==(2*(v/2)))?'_':' ';
printf("%c%c",x,y);
}
printf("|\n");
}
}