int main() {
int n;
while (scanf("%d", &n) != EOF) {
int m = 3 * n, temp = 1, count = 0;
int val = m;
for (int i = 0; i < m + n; i++) {
if (i < m) { //判断当前行是否为叶子行数
if (i % 3 == 0 && i != 0) count++; //记录三角形图案形成数量
for (int j = val--; j > 1; j--) { //输出树前端空格
printf(" ");
}
for (int k = temp++, l = 0; k > 0; k--, l++) { //输出当前行所需的符号*,l记录输出次数
if (count > 0 && (i + 1) % 3 != 0) { //判断是否处于特殊行,三角形第一行与第二行
if ((i + 1) % 3 == 1) { //处于第一行
for (int x = 0; x <= count; x++) { //输出* 后输出两次双空格
printf("* ");
for (int y = 0; y < 2; y++) {
printf(" ");
}
}
} else { //处于第二行
for (int x = 0; x <= count; x++) { //输出* * 后输出一次双空格
printf("* * ");
for (int y = 0; y < 1; y++) {
printf(" ");
}
}
} //判断特殊行输出次数是否等于实际个数
if (l = count) {
l = 0;
break;
}
} else printf("* "); //正常行数输出
}
} else { //根行数输出
for (int z = 0; z < m - 1; z++) printf(" ");
printf("*");
}
printf("\n");
}
}
return 0;
}