P1296 分形宇宙
题目描述
魔法世界的科学家分形宇宙论,即宇宙是一个基本微粒,构成宇宙的无数个微粒又会有其他的小宇宙。分形定义如下:
1 度的分形为:
X
2 度的分形为:
X X
X
X X
如果 B (n-1) 表示 n-1 度的分形,则 n 度的分形递归定义如下:
B(n-1) B(n-1)
B(n-1)
B(n-1) B(n-1)
要求给定分形的度,输出相应的分形图。
输入描述
多组输入,每组输入一个正整数 n
输出描述
对应于每组数,输出相应的分形图,并用一个 “-” 分隔
样例输入
1
2
样例输出
X
-
X X
X
X X
-
问题分析:
输入为:n,输出为:宇宙形状
由问题是递归定义的可知,很容易得到本题解法:递归;
每一个宇宙由对应五个上一级宇宙构成,所以问题的解空间为一个五叉数
在一个二维数组中用i,j保存五个上一级宇宙对应的起始位置。
函数出口为:n=1
递归调用函数即可。
代码展示:
#include<iostream>
#include<cmath>
using namespace std;
char a[1000][1000];
void printa(int n)
{
int len=pow(3,n-1);
for(int i=0;i<len;++i)
{
for(int j=0;j<len;++j)
cout<<a[i][j];
cout<<endl;
}
}
void init_a(int n)
{
int len=pow(3,n-1);
for(int i=0;i<len;++i)
for(int j=0;j<len;++j)
a[i][j]=' ';
}
void B(int n,int i,int j)
{
if(n==1)
{
a[i][j]='X';
return;
}
int size=pow(3,n-2);
B(n-1,i,j);
B(n-1,i+size,j+size);
B(n-1,i,j+2*size);
B(n-1,i+2*size,j);
B(n-1,i+2*size,j+2*size);
}
int main()
{
int n=0;
while(cin>>n)
{
init_a(n);
B(n,0,0);
printa(n);
cout<<"-"<<endl;
}
return 0;
}