题解 | #超级圣诞树#
超级圣诞树
https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423
//使用递归,将大的三角拆分成3个小的三角,直至拆成最小的一个三角 #include <stdio.h> #include <math.h> //将"*"存放于一个800*400的数组中,以1代表"*"、0代表" ",生成三角形时初始化为1 int arr[800][400]={0}; //数组最大需要宽为3*2的8次(768),高为3*2的7次(384) //此处使用递归生成三角形部分 void create(int x,int y,int n)//(x,y)为起始坐标,n为三角形的大小 { if (n>1)//一个大的三角由三个小一号的三角构成 { //生成上面的三角 create(x,y,n-1); //生成左下角的三角 create(x-3*pow(2,n-2),y-3*pow(2,n-2),n-1);//此处三角形x、y每次改变的值须由n求得 //生成右下角的三角 create(x+3*pow(2,n-2),y-3*pow(2,n-2),n-1);//直接由x、y的值求是错误的 } else //生成一个最小的三角 { int i,j; for(i=0;i<3;i++) { for(j=-i;j<i+1;j+=2) { arr[x+j][y-i]=1; } } } } int main() { int i,j,n; while (scanf("%d",&n) != EOF) { //生成一个顶点在(3*pow(2,n-1),3*pow(2,n-1),大小为n的三角 create(3*pow(2,n-1),3*pow(2,n-1),n); //把生成的三角形打印出来作为树叶部分 for(i=3*pow(2,n-1);i>0;i--)//三角形有3*pow(2,n-1)层 { for(j=1;j<3*pow(2,n);j++)//每一层有3*pow(2,n)个 { if (arr[j][i]==1) printf("*"); else printf(" "); } printf("\n"); //一层打印完成换行 } //打印树干部分 for(i=0;i<n;i++) { for(j=0;j<3*pow(2,n-1)-1;j++)//大小为n时"*"前需要3*pow(2,n-1)-1个空格 { printf(" "); } printf("*\n"); } } return 0; }