//对于小白来说,是真滴难~,只能仿造大佬的思路来写 #include <stdio.h> #include <math.h> int main() { int a = 0; while (~scanf("%d", &a)) { char arr[800][800]={0}; int top_y = 3*pow(2,a-1)-1;//确定顶点*的位置 arr[0][top_y] = '*'; arr[1][top_y-1] = '*'; arr[1][top_y+1] = '*'; arr[2][top_y-2] = '*'; arr[2][top_y] = '*'; arr[2][top_y+2] = '*';//每次进来,先确定一个小树,接着就是要复制小树 //将小树复制到该小树的左下角和右下角,复制完之后整体又当作一个树 //接着再将该整体树又复制到该整体树的左下角和右下角,就这样一直循环下去 int i = 0; //先进行复制 for (i = 1; i < a; i++)//复制次数。已经确定了一个小树,复制次数要比输入的数字少1 { int range = 3*pow(2,i-1)-1;//每次要复制的树是几层,层数从0开始计数,因为数组是从0开始 int x = 0; for(x=0; x<=range; x++)//需要复制的层数 { int y = 0; for(y=top_y-range; y<=top_y+range; y++)//每一层复制多少次 { arr[x+range+1][y-range-1]=arr[x][y];//复制到左边,从小树左下角的第一个*先复制 arr[x+range+1][y+range+1]=arr[x][y];//复制到右边,从小树左下脚的第一个*先复制 } } } //开始打印树 for(i=0; i<=3*pow(2,a-1)-1; i++) { int j = 0; for(j=0; j<=3*pow(2,a)-2; j++) { if(arr[i][j]=='*') { printf("%c",arr[i][j]); } else { printf(" "); } } printf("\n"); } //打印树干 for(i=0; i<a; i++) { int j = 0; for(j=0; j<3*pow(2,a-1)-1; j++) { printf(" "); } printf("*\n"); } } return 0; }