#include <stdio.h>
#include <math.h>
int main() {
int n, i, j;
scanf("%d", &n);
int a = pow(2, n - 1) * 3; // 计算树的主体高度
int width = 2 * a - 1; // 树的总宽度 `width`
char chs[a + n][width]; // a + n 行用于容纳树的主体和树干
// 初始化字符数组为空格,填充整个二维数组
for (i = 0; i < a + n; i++) {
for (j = 0; j < width; j++) {
chs[i][j] = ' ';
}
}
// 绘制初始的基础三角形
chs[0][a - 1] = '*';
chs[1][a - 2] = chs[1][a] = '*';
chs[2][a - 3] = chs[2][a - 1] = chs[2][a + 1] = '*';
// 递归生成更大的三角形
int h = 3; // 初始高度 `h` 设置为3,对应基础三角形的高度
while (h < a) { // 当高度小于 `a` 时循环,递归构建更大的三角形
for (i = 0; i < h; i++) { // 遍历当前高度的每一行
// a - 1 是三角形的中心位置,通过 a - 1 - i 和 a - 1 + i 控制每一行的左右边界。
for (j = a - 1 - i; j <= a - 1 + i; j++) {
chs[i + h][j - h] = chs[i][j]; // 将当前行的星号区域复制到左下方
chs[i + h][j + h] = chs[i][j]; // 将当前行的星号区域复制到右下方
}
}
h *= 2; // 将高度 `h` 翻倍,继续递归构建更大的三角形
}
// 绘制树干
for (i = a; i < a + n; i++) {
chs[i][a - 1] = '*';
}
// 遍历字符数组输出结果
for (i = 0; i < a + n; i++) {
for (j = 0; j < width; j++) {
printf("%c", chs[i][j]);
}
printf("\n");
}
return 0;
}