【分形 分治】 Fractal
传送门
题意
每一级盒子有\(5\)个上一级盒子
第一级只有一个,输入一个\(n\),输出当前级的图形,
两个输出之间间隔一个 ' - '
一级盒子:
X
二级盒子:
X X
X
X X
\(n\)级盒子
B(n - 1) B(n - 1)
B(n - 1)
B(n - 1) B(n - 1)
数据范围
\(1\leq n \leq 7\)
题解
-
数据范围最多到\(7\)级,预处理每一级五个基本图形的边长,从第\(n\)级开始递归
-
递归树中每一级的每个节点都扩展出\(5\)个节点,递归函数包含当前点的\(x、y\)坐标,标记每个应该包含图形的点
-
最后根据每个位置的标记和预处理的边长输出图形即可
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int N=1010;
int len[N];
bool a[N][N];
int n;
void fractal(int n,int x,int y)
{
if(n==1)
{
a[x][y]=1;
return;
}
fractal(n-1,x,y);
fractal(n-1,x,y+len[n-1]*2);
fractal(n-1,x+len[n-1],y+len[n-1]);
fractal(n-1,x+len[n-1]*2,y);
fractal(n-1,x+len[n-1]*2,y+len[n-1]*2);
}
void fractal()
{
fractal(n,1,1);
rep(i,1,len[n]+1)
{
rep(j,1,len[n]+1)
putchar(a[i][j]?'X':' ');
puts("");
}
puts("-");
memset(a,0,sizeof a);
}
int main()
{
len[1]=1;
rep(i,2,8) len[i]=len[i-1]*3;
while(scanf("%d",&n) && n!=-1)
{
fractal();
}
}

浙公网安备 33010602011771号