1 条题解

  • 0
    @ 2023-12-31 0:36:14

    image 这是一个美丽的分形,上面是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
    上传者