#include static unsigned X=50,Y=16,x,y,x1,x2,y1,y2,k,F; static char*f="Usage: sig1i [ []]\n\n"; extern int putchar(int); static char *G(int m, int n) { if(!f) { /* varaus, tyhjäksi alustus ja reunaseinät */ for(X=--m|1, Y=1|--n, f=(char*)calloc(X+1,Y+1); X>x||xx ? *G(x,0) = *G(x,Y-1) = 1 : 0, Y>x && x>1 ? *G(0,x) = *G(X-1,Y-1-x) = 1 : 0; /* seinillä täyttö */ for(F=(X-3)*(Y-3)/4;F;) if(rand()%2) { /* pystysuuntainen */ x = (rand()%X) & ~1; /* arvotaan alku */ y1 = (rand()%Y) & ~1; y2 = (rand()%Y) & ~1; if(y2 < y1) /* käännetään toisinpäin jos on väärinperin */ k = y1, y1 = y2, y2 = k; for(k=0,y=y1; y<=y2; y++) /* tarkistetaan osumamäärä */ if(*G(x,y))k++; if(!--k) /* jos oli 1 */ for(F++,y=y1; y<=y2; y++) /* niin tallennetaan seinä */ *G(x,y) = y%2 || (F-- != 0); } else { /* vaakasuuntainen */ y = (rand()%Y) & ~1; x1 = (rand()%X) & ~1; x2 = (rand()%X) & ~1; if(x2 < x1) k = x1, x1 = x2, x2 = k; for(k=0,x=x1; x<=x2; x++) if(*G(x,y))k++; if(!--k) for(F++,x=x1; x<=x2; x++) *G(x,y) = x%2 || F-- != 0; } /* tulostus */ for(;Y>k;putchar('\n'),k++) for(m=F;m^X;putchar(" -|+"[(x+n+n)**G(m++,k)])) { x = *G(m+1,k) | (m&&*G(m-1,k)); n = *G(m,k+1) | (k&&*G(m,k-1)); } } return &m[n*(X+1)+f]; } int main(int A, const char**V) { extern int time(int); /* usage */ for(srand(time(k)); F^34; putchar(f[F++])); /* parametrit */ for(f=(char*)0;--A;)*(k++?&Y:&X)=atoi(*++V); /* toiminta */ return(int)G(X,Y); }