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;
}