POJ-3768: Repeater
問題概要
フラクタルな図形を書く問題。
解法
実装するだけ。ただし、もとのサイズが1の場合は、深さが大きい値の可能性を考慮するべき。
感想
入力の読み込みとか改行コードとかでミスを大量に重ねた。いもす先生に教わったけど、scanf("[^\n]",buf);とかを使うのが良さげ。ついでにTLEもやたら厳しかった。GCCからCへ変更したら通った。
#include <stdio.h> #include <string.h> int N; int D; char elem[6][6]; char ans[3009][3009]; void rec(int y, int x, int n, int depth){ int i,j,newN=n/N; if(depth == 1){ for(i=0; i<N; i++)for(j=0; j<N; j++)if(elem[i][j]!=' '){ ans[y+i][x+j] = elem[i][j]; } return ; } for(i=0; i<N; i++)for(j=0; j<N; j++)if(elem[i][j]!=' '){ rec(y + newN*i, x + newN*j, newN ,depth-1); } } void solve(){ int n=1, i, j; memset(ans, ' ', sizeof(ans)); for(i=0; i<D; i++) n *= N; for(i=0; i<n; i++){ ans[i][n] = '\0'; } if(N==1) D=1; rec(0,0,n,D); for(i=0;i<n;i++){ printf("%s",ans[i]); if(i<n-1) printf("\r\n"); } } int main(){ int i,j,c=0; char buf[10]; while(N=atoi(gets(buf))){ if(!N) break; if(c++) printf("\r\n"); for(i=0; i<N; i++){ gets(elem[i]); elem[i][N] = '\0'; } D = (atoi(gets(buf))); if(D)solve(); } return 0; }