描述
 
 
题解
谢尔宾斯基三角形,有趣的问题,图形打印,根据前一个状态拼接出来下一个状态,样例可以发现,这里相当于下边是两个前一个状态的三角形并列,上边是前一个状态的三角形居中。注意补空格!
这个问题内存比较吃紧,所以一开始 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;
}
 京公网安备 11010502036488号
京公网安备 11010502036488号