递归4:分形
题源:【SSL】1562
题目:
分形(fractal)是物体在数量上,内容上“自相似”的一种数学抽象。
一个盒分形(box fractal)定义如下:
1度的盒分形为
X
2度盒的分型为
如果B(n - 1)表示n – 1度的盒分形,则n度的盒分形递归定义如下:
请画出n度的盒分形的图形。
输入
由若干测试用例组成,每行给出一个不大于7的正整数。输入的最后一行以一个负整数-1表示输入结束。
输出
对于每个测试用例,输出用’X’标记的盒分形。注意’X’是大写字母。在每个测试用例后输出包含一个单破折号的一行。
输入样例
1
2
3
4
-1
输出样例
思路:
这道题如果能想到思路还是挺好做的。主要是我一开始想错了。
开一个二维字符数组,每输入一个数据就去找ta的中心点,然后往五个位置递归(上面有图),一直到递归的数据为1,然后把当前位置的数组里面设为 “X” ,然后在递归结束之后输出数组,再输出 “_” ,最后记得要把数组里面全设为 “ ” ,不然输出会炸。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,h;
char a[800][800];
void b(int x,int y,int z)
{
if(z==1)
{
a[x][y]='X';
return ;
}
int d=pow(3,z-2);
b(x-d,y-d,z-1);
b(x-d,y+d,z-1);
b(x+d,y-d,z-1);
b(x+d,y+d,z-1);
b(x,y,z-1); //往5个方向递归
}
int main()
{
while(1)
{
cin>>n;
if(n==-1)
break;
int m=pow(3,n-1);
b(m/2+1,m/2+1,n);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
cout<<a[i][j];
puts("");
}
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
a[i][j]=' '; //清空数组
puts("-");
}
return 0;
}