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