ACM模版

描述


题解

谢尔宾斯基三角形,有趣的问题,图形打印,根据前一个状态拼接出来下一个状态,样例可以发现,这里相当于下边是两个前一个状态的三角形并列,上边是前一个状态的三角形居中。注意补空格!

这个问题内存比较吃紧,所以一开始 WA、MLE 了几发,忽略了很重要的一点,虽然这个看起来是等边三角形,可是行数和列数是两倍关系,最开始开错了~~~

代码

#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 11;
const int MAXM = 1100;
const int MAXR = 2100;

char map[MAXN][MAXM][MAXR] = {
  {}, {
  " /\\ ",
                                   "/__\\"}};

void init()
{
    for (int i = 2; i < MAXN; i++)
    {
        int col = 1 << (i - 1);
        int row = 1 << i;

        for (int j = 0; j < col; j++)
        {
            for (int k = 0; k < col; k++)
            {
                map[i][j][k] = map[i][j][k + col + row] = ' ';
            }
        }

        for (int j = 0; j < col; j++)
        {
            for (int k = 0; k < row; k++)
            {
                map[i][j][col + k] = map[i - 1][j][k];
            }
        }

        for (int j = 0; j < col; j++)
        {
            for (int k = 0; k < row; k++)
            {
                map[i][col + j][k] = map[i][col + j][k + row] = map[i - 1][j][k];
            }
        }
    }
}

int main(int argc, const char * argv[])
{
    init();

    int n;
    while (cin >> n, n)
    {
        int col = 1 << n;
        int row = (1 << n) + 1;
        for (int i = 0; i < col; i++, row++)
        {
            for (int j = 0; j < row; j++)
            {
                printf("%c", map[n][i][j]);
            }
            putchar(10);
        }
        putchar(10);
    }

    return 0;
}