#include <stdio.h>
int main() {
int i, j;
int k, h, n, z,s,m;
int rowbegin,rowend,rankbegin,rankend;
scanf("%d",&n); //输入数值
int X = 3*(1<<n-1);
int Y = 5*(1<<n-1)+(1<<n-1)-1;
char b[X][Y]; //定义一个刚好可以存放图形的二维数组
for(i=0;i<X;i++) //将数组初始化,全为空格
{
for(j=0;j<Y;j++)
{
b[i][j] = ' ';
}
}
for(i=0;i<3;i++) //将输入为 1 时的图形存放到数组内
{
for(j=0;j<5;j++)
{
if((i==0 && j%2==0) || (i%2!=0 && j%2!=0) || i==j)
{
b[i][j] = '*';
}
else
{
b[i][j] = ' ';
}
}
}
for(h=0,z=0,k=0,s=0,m=0;s<n+n-1;h++,z++,s++,k=0) //控制循环的次数
{
if (z>1)
{
z=0;
h--;
k=h;
m=k;
}
rowbegin = (k>0)*3*(1<<k-1); //控制行的开始数值
rowend = 3*(1<<m); //控制行的结束数值
rankbegin = (h>0)*(5*(1<<(h-1))+(1<<(h-1)))-((k>0)<<k-1)*(3); //控制列的开始数值
rankend = 5*(1<<h)+(1<<h)-1-((k>0)<<k-1)*(3); //控制列的结束数值
for(i=rowbegin;i<rowend;i++)
{
for(j=rankbegin;j<rankend;j++)
{
b[i][j] = b[i-rowbegin][j-rankbegin];
}
}
}
for(i=X-1;i>=0;i--) //输出树叶
{
for(j=Y-1;j>=0;j--)
{
printf("%c",b[i][j]);
}
putchar('\n');
}
for(i=0;i<n;i++) //输出树干
{
for(j=0;j<Y;j++)
{
printf("%c",b[X-1][j]);
}
putchar('\n');
}
return 0;
}