[POJ2083]Fractal[递归]

题面

这种数据范围不大的分形绘图题可以直接在一个二维数组中处理, 根据坐标绘图很水很方便.

直接以左上角一个构造好的次级分形为模板, 按要求复制到 右上 中间 左下 右下 递归即可.

打表代码有将近600KB, 提交的时候直接报错, 别问我怎么知道的…

#include<cstdio>
#include<cstring>
#define in inline
#define re register
in int read()
{
	int s(0),b(0);char ch;
	do{ch=getchar();if(ch=='-')b=1;}while(ch<'0'||ch>'9');
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	if(b) return -s;
	return s;
}
char s[731][731];
int p[7]={1,3,9,27,81,243,729};
void out(int de)
{
	if(de==1) {s[1][1]='X';return;}
	out(de-1);
	for(int i=1;i<=p[de-2];++i)
		for(re int j=1;j<=p[de-2];++j)
			s[i][j+2*p[de-2]]=s[i][j];
	for(int i=1;i<=p[de-2];++i)
		for(re int j=1;j<=p[de-2];++j)
			s[i+p[de-2]][j+p[de-2]]=s[i][j];
	for(int i=1;i<=p[de-2];++i)
		for(re int j=1;j<=p[de-2];++j)
			s[i+2*p[de-2]][j]=s[i][j];
	for(int i=1;i<=p[de-2];++i)
		for(re int j=1;j<=p[de-2];++j)
			s[i+2*p[de-2]][j+2*p[de-2]]=s[i][j];
}
signed main()
{
	while(1)
	{
		memset(s,' ',sizeof(s));
		int n=read();
		if(n==-1) break;
		out(n);
		for(re int i=1;i<=p[n-1];++i)
		{
			for(re int j=1;j<=p[n-1];++j)
				printf("%c",s[i][j]);
			printf("\n");
		}
		printf("-\n");
	}
	return 0;
}
赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址