牛客网刷题 | BC115 超级圣诞树 (不理解)

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


 好好好 

这题还是不会

给大家水了一篇

等我学会了再出个详细教程

小伙伴们有思路或者有教程的可以放在评论区

我去学习

代码来自牛客网

#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;
 }
   
 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值