列表

详情


BC115. 超级圣诞树

描述

今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。

输入描述

输入圣诞树的大小 n

输出描述

输出对应的圣诞树

示例1

输入:

1

输出:

  *
 * *
* * *
  *

说明:

示例2

输入:

2

输出:

     *
    * *
   * * *
  *     *
 * *   * *
* * * * * *
     *
     *

说明:

示例3

输入:

3

输出:

           *
          * *
         * * *
        *     *
       * *   * *
      * * * * * *
     *           *
    * *         * *
   * * *       * * *
  *     *     *     *
 * *   * *   * *   * *
* * * * * * * * * * * *
           *
           *
           *

说明:

示例4

输入:

4

输出:

                       *
                      * *
                     * * *
                    *     *
                   * *   * *
                  * * * * * *
                 *           *
                * *         * *
               * * *       * * *
              *     *     *     *
             * *   * *   * *   * *
            * * * * * * * * * * * *
           *                       *
          * *                     * *
         * * *                   * * *
        *     *                 *     *
       * *   * *               * *   * *
      * * * * * *             * * * * * *
     *           *           *           *
    * *         * *         * *         * *
   * * *       * * *       * * *       * * *
  *     *     *     *     *     *     *     *
 * *   * *   * *   * *   * *   * *   * *   * *
* * * * * * * * * * * * * * * * * * * * * * * *
                       *
                       *
                       *
                       *

说明:

原站题解

C 解法, 执行用时: 3ms, 内存消耗: 784KB, 提交时间: 2022-01-16

#include <stdio.h>
int main()
{
	int i, j, k, h, X, Y, n, z,s,m;
	scanf("%d",&n);

	i = 1<<n-1;
    j = 1<<n-1;
    X = 3*i;
    Y = 5*j+(j-1);
	 char a[3][5] = {{'*',' ','*',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' ',}};
	char b[X][Y];//= {{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1}};//{{0},{0},{0},{0},{0},{0}};

	for(i=0;i<X;i++)
		{
		for(j=0;j<Y;j++)
			{
				//printf("%d ",b[i][j]);
				b[i][j] = ' ';
				//printf("%c ",b[i][j]);
			
			}
		//putchar('\n');
		}
	for(i=0;i<3;i++)
		{
		for(j=0;j<5;j++)
			{
				
				b[i][j] =a[i][j];
				//printf("%c",b[i][j]);
			
			}
		//putchar('\n');
		}
		


	//for(k=0;k<n;k++)
		{
			for(h=0,z=0,k=0,s=0;s<n+n-1;h++,z++,s++,k=0)
				{
						
					if (z>1)
						{
						z=0;
						h--;
						k=h;
						m=k;
						//m++;
						}
					//printf("h = %d ",h);
					//printf("k = %d ",k);
					//printf("m = %d ",m);
					//printf("s = %d ",s);
					//printf("z = %d ",z);
					//putchar('\n');
					
					
					for(i=(k>0)*3*(1<<k-1);i<3*(1<<m);i++)//(k>0)*3*(1<<k-1)
						{
							
							for(j=(h>0)*(5*(1<<(h-1))+(1<<(h-1)))-((k>0)<<k-1)*(3);j<5*(1<<h)+(1<<h)-1-((k>0)<<k-1)*(3);j++)
								{
									//printf("%d  ",j-(h>0)*(5*(1<<h-1)+(1<<h-1)-(k>0)*(n+1)));
									//printf("%c",b[i][j]);
									b[i][j] = b[i-(k>0)*3*(1<<k-1)][j-(h>0)*(5*(1<<h-1)+(1<<h-1)-((k>0)<<k-1)*(3))];
								}
								
						}
					//putchar('\n');
				}
		}


	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');
		}
    
    //printf("%d\n",count);
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 804KB, 提交时间: 2022-02-14

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

C 解法, 执行用时: 3ms, 内存消耗: 808KB, 提交时间: 2022-03-04

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

C 解法, 执行用时: 3ms, 内存消耗: 808KB, 提交时间: 2022-01-18

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

C 解法, 执行用时: 3ms, 内存消耗: 820KB, 提交时间: 2022-05-01

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

上一题