1 条题解

  • 0
    @ 2025-4-8 23:15:58

    解题思路:

    原题目中对于谢尔宾斯基三角形的描述为, "Consider a regular triangular area, divide it into four equal triangles of half height and remove the one in the middle. Apply the same operation recursively to each of the three remaining triangles.",意为“将一个三角形区域分割为相同大小的四个三角形,使他们的高长为原三角形区域的一半。去掉中间的小三角形,并递归地对剩下的三个三角形实施同样的操作。” 这其实已经明示了让我们使用递归来解题。我们干脆顺着题目的思路,使用递归解决此问题。 要解决这个问题,我们应当找到每个最小的三角形应该在的位置,并在这个位置将最小三角形打印出来。按照我们之前对题意的分析,我们可以用递归的方法找出这些位置。 我们不妨定义一个函数,它的参数包含三角形的维度,以及该三角形的位置信息。每个n维的三角形都可以认为是占用了一个矩形空间(矩形的长为三角形的底边,宽为三角形的高)。我们不妨以它们占用地矩形空间左上角端点的坐标来记录他们所在的位置信息。因此,我们需要建立一个二维的坐标系来描述这些端点的位置。这些端点的坐标记作(x, y)。这个坐标系也就是我们画三角形的画布。 最开始,我们将目标三角形的维度n传入函数中。显然,该目标的位置在坐标系的左上角,我们可以将其记作(0,0)。根据对谢尔宾斯基三角形的观察,我们不难发现,维度为n的三角形的底长为d=2^(n+1),高长为h=2^n。我们可以据此计算出在该三角形中所构造的三个(n-1)维三角形所在矩形的左上端点坐标。 接下来,再次调用该函数,把维度(n-1),和这三个位置信息分别传入函数中。若此时的维度(n-1)已经为1,则说明我们已经找到了最小三角形的位置,位置信息便是本次传入此函数的参数。我们应当在坐标系画布中画出此三角形。 若维度(n-1)仍不为1,说明我们仍未找到最小三角形。此时应再次调用该函数,将维度(n-2),和三个在此三角形中产生的,维度为(n-2)的小三角形的位置信息分别传入函数中。如此往复,直至维度为1为止。

    #include<iostream>
    #include<cmath>
    using namespace std;
    char huabu[3000][3000];//画布
    void hua(int x, int y, int n)
    //此处的x和y表示该矩形左上角顶点的横纵坐标
    {
        if(n == 1)//若此三角形为最小三角形
        {
            huabu[y][x + 1] = '/';
            huabu[y][x + 2] = '\\';//字符'\'需要用'\\'表示
            huabu[y + 1][x] = '/';
            huabu[y + 1][x + 1] = '_';
            huabu[y + 1][x + 2] = '_';
            huabu[y + 1][x + 3] = '\\';
            return;
        }
        
        int h = pow(2.0, n);//n维三角形的高长
        int d = pow(2.0, n + 1);//n维三角形的底长
        hua(x + (d / 4), y, n - 1);//画出位于原三角形区域上部的三角形,其维度为n-1,占用的矩形区域左上角顶点坐标为(x+(d/4),y)
        hua(x, y + (h / 2), n - 1);//画出位于原三角形区域左下部的三角形
        hua(x + (d / 2), y + (h / 2), n - 1);//画出位于原三角形区域右下部的三角形
    }
    
    int main()
    {
        int n,i,j,d,h;
        for(;;)
        {
            cin >> n;
            if(n == 0)
                return 0;
            h = pow(2.0, n);
            d = pow(2.0, n + 1);
            
            for(i = 0; i < h; i++)
                for(j = 0; j < d; j++)
                huabu[i][j] = ' ';//清空画布。使图形中没有线条的部分被空格占满,显示出空白的效果。
                
            hua(0, 0, n);
            for(i=0; i<h; i++)
            {
                for(j = 0; j < d; j++)
                    cout << huabu[i][j];
                cout << endl;
            }
            cout << endl;
        }
    }
    
    
    
    
    • 1

    信息

    ID
    942
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者