• 【t006】三角形分形描绘问题


    Time Limit: 1 second
    Memory Limit: 50 MB

    【问题描述】
    分形是以多种概念和方法相互冲击融合为特征的图形。分形所呈现的无穷玄机和美感引发人们去探索。分形使人们觉悟到科学与艺术的融合,数学与艺术审美上的统一,使昨日枯燥的数学不再仅仅是抽象的哲理,而是具体的感受;不再仅仅是揭示一类存在,而是一种艺术创作,分形搭起了科学与艺术的桥梁。 在分形艺术中,蕴含着浓厚的递归思想。下图是著名的Sierpinski Triangle。

    编程任务:
    我们使用ASCII码字符斜杠‘/’,反斜杠‘’,下划线‘_’,空格‘ ’进行Sierpinski Triangle的描绘,例如,当n=1时,我们画出最小的三角形。
    /
    /__

    【输入】

     第一行包括一个正整数n(1 ≤ n ≤ 10),表示要描绘的Sierpinski Triangle的递归程度。
    

    【输出】

    输出递归程度为n的Sierpinski Triangle。
    

    注意:每行的末尾以反斜杠‘’结束,行末不要包括多余的空格,每行开始与三角形的中心空白处,以ASCII空格填充。
    【输入样例】

    2
    

    【输出样例1】

       /
      /__
     /  /
    /__/__
    

    【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t006

    【题意】

    【题解】

    先搞出n=1的情况;
    然后每次把n-1的情况复制3个就好.
    写个递推.
    注意每个新的三角的位置坐标就好.

    【完整代码】

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%lld",&x)
    #define ref(x) scanf("%lf",&x)
    
    typedef pair<int, int> pii;
    typedef pair<LL, LL> pll;
    
    const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
    const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
    const double pi = acos(-1.0);
    const int N = 3000;
    
    struct abc
    {
        char s[1030][2050];
        int kuan, gao;
    };
    
    abc ans[11];
    
    void o(int x,int gao,int kuan)
    {
        rep2(i, gao, 1)
        {
            int up = kuan;
            while (ans[x].s[i][up]==' ') up--;
            rep1(j, 1, up)
                putchar(ans[x].s[i][j]);
            puts("");
        }
    }
    
    void get_one()
    {
        ans[1].s[1][1] = '/';
        ans[1].s[1][2] = '_';
        ans[1].s[1][3] = '_';
        ans[1].s[1][4] = '\';
        ans[1].s[2][2] = '/';
        ans[1].s[2][3] = '\';
        ans[1].kuan = 4;
        ans[1].gao = 2;
    }
    
    void fuzhi(int pos, int x, int y)
    {
        rep1(i,1,ans[pos-1].gao)
            rep1(j, 1, ans[pos-1].kuan)
                ans[pos].s[x + i - 1][y + j - 1] = ans[pos-1].s[i][j];
    }
    
    void get_ans()
    {
        int now = 2;
        rep1(i, 2, 10)
        {
            fuzhi(i,now + 1, now + 1);
            fuzhi(i, 1, 1);
            fuzhi(i, 1, ans[i - 1].kuan + 1);
            ans[i].kuan = 2 * ans[i - 1].kuan;
            ans[i].gao = 2 * ans[i - 1].gao;
            now <<= 1;
        }
    }
    
    void input_data()
    {
        int n;
        rei(n);
        o(n,ans[n].gao,ans[n].kuan);
    }
    
    int main()
    {
        //freopen("D:\rush.txt", "r", stdin);
        //freopen("D:\rush_out.txt","w",stdout);
        rep1(i,1,10)
            rep1(j,1,1029)
                rep1(k,1,2049)
                    ans[i].s[j][k] = ' ';
        get_one();
        get_ans();
        input_data();
        //printf("
    %.2f sec 
    ", (double)clock() / CLOCKS_PER_SEC);
        return 0;
    }
  • 相关阅读:
    剑指 Offer 60. n个骰子的点数
    剑指 Offer 59
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
    AndroidStudio中提示:Didn't find class "android.support.v7.widget.RecyclerView"
    SpringBoot中通过重写WebMvcConfigurer的addCorsMapping方法实现后台服务解决跨域问题
    Android中使用Room时怎样存储带list集合的对象
    Android中在使用Room时提示:Cannot figure out how to save this field into database. You can consider adding a type converter for
    Android中ListView的使用以及使用适配器设置数据源
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626556.html
Copyright © 2020-2023  润新知