旧oj系统上的题。
问题描述
在一定的技术意义下,分形是在所有标度上显示自相似性的一个对象或数量。对象不必在所有标度上展示完全相同的结构,但在所有标度上显示同样的结构“类型”。
递归分治
从样例可以找找规律。
第degree个图形打印,最长的那行是pow(3,n-1)个字符,两个(degree-1)的图形之间隔了pow(3,degree-2)个图形,每次要构建左上,右上,中间,左下,右下的图形。x,y是要构建图形的坐标。必须从1,1开始。(不懂为什么),0,0的话不能显示完整图形。
ac代码
#include<bits/stdc++.h>
using namespace std;
char graph[1000][1000];
void build(int x,int y,int degree)
{
int s;
if(degree==1)
{
graph[x][y]='X';
return;
}
else
{
s=(int)pow(3,degree-2);
build(x,y,degree-1);//左上
build(x,y+2*s,degree-1);//左下
build(x+s,y+s,degree-1);//中间
build(x+2*s,y,degree-1);//右上
build(x+2*s,y+2*s,degree-1);//右下
}
}
int main()
{
int n;
while(scanf("%d",&n))
{ if(n==-1)
return 0;
memset(graph,' ',sizeof(graph));
build(1,1,n);
int s=pow(3,n-1);
int t,j;
for(int i=1;i<=s;i++)
{ for(j=0;j<=s;j++)
{
if(graph[i][j]=='X')
t=j;
}
graph[i][t+1]='\0';
}
for(int i=1;i<=s;i++)
{
printf("%s\n",graph[i]+1);
}
printf("-\n");
}
return 0;
}