1 条题解
-
0
这是一个美丽的分形,上面是N=6时的输出。
分形(fractal)指组成图形的部分,和图形本身相似的图形。这在数学上可以描述为递归。 用递归算法实现简单优雅。
分析N=2,N=3时候的情形,再考虑下N=1时图形的形状,容易得出递归的2要素:
- 一个N阶图形由3个N-1阶图形构成
- 最小图形为N=1时三角形
画出1阶三角没有难度,这里要关注的时3个N-1阶图形如何堆叠(相对位置的关系)。
考察N=1,2,3的情况,可以知道N阶图形:
- 高=2^(N-1)*2 = 2^N
- 底边长= 2^(N-1)*4 = 2^N * 2
那么,如果要在左下角坐标为(h,l)的位置输出一个N阶图形, 可以分解为画3个N-1阶图型。
N-1阶的高(设为p):2^(N-1),底边:2^N (=2p)
- 从h处上移一个N-1阶图高度h-p,右移N-1阶图底边长的一半l+2p/2=l+p,绘制一个N-1阶图
- 在(h,l)处绘制一个N-1阶图
- 在(h,l+2p)处绘制一个N-1阶图
这样,递归关系和中止条件都确定了,可以开始动手了coding了。
因为N阶的底边长为 2^N * 2,N<=10,则开设的图形数组大小为2^10*2,二进制人扫一眼可知=2048
#include <bits/stdc++.h> using namespace std; //bottom_length = 2^(N-1)*4; height = 2^(N-1)*2 = 2^N char m[512*4][512*4]; void draw_atom(int h,int l){ m[h-1][l+1]='/';m[h-1][l+2]='\\'; m[h][l]='/';m[h][l+1]='_';m[h][l+2]='_';m[h][l+3]='\\'; } //draw a triangle with left-down at [h,l] void draw(int N, int h, int l){ if (N==1) return draw_atom(h,l); int p=pow(2,N-1); draw(N-1,h-p,l+p); //draw top one triangle draw(N-1,h,l);draw(N-1,h,l+2*p);//the bottom two } int main(){ int n; cin>>n; int p=pow(2,n); //heigh of N-level triangle draw(n,p-1,0); //h,l starts from 0,here should be p-1 for (int i=0;i<p;i++){ for (int j=0;j<2*p;j++) cout<<(m[i][j]!=0?m[i][j]:' '); cout<<endl; } return 0; }
- 1
信息
- ID
- 497
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 5
- 已通过
- 4
- 上传者