超级圣诞树(BC115) 【题解】超详细

这篇具有很好参考价值的文章主要介绍了超级圣诞树(BC115) 【题解】超详细。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

这个题看了很久,没想出来,然后看了一些大佬的题解(可能是我的理解能力有些慢),中途有很多次放弃的想法,但是最终坚持着 ,研究明白了。

所以想结合我的想法更加具体分享一下

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言 

题目

描述

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

输入描述

输入圣诞树的大小 n

1 ≤  n ≤  8

输出描述

输出对应的圣诞树

难度 中等

题目链接  BC 115 超级圣诞树

示例1

输入:

1

输出:

  *
 * *
* * *
  *

说明:

 

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

示例2

输入:

2

输出:

     *
    * *
   * * *
  *     *
 * *   * *
* * * * * *
     *
     *
说明:
 

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

示例3

输入:

3

输出:

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

说明:

 

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

 

示例4 

输入:

4

输出:

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

说明:

 

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

 

 

解题的核心思想:  使用二维数组来进行存储图案 

 代码展示

 

#include<stdio.h>
int main() 
{

	//使用二维数组存储圣诞树 
	/*
	* 首先根据规律计算出 二维数组行和列的上限
	* //行的规律是 pow(2,(n-1))*3+n  当n == 8时  row = 392
	* //列的规律是 pow(2,n)*3 - 1    当n == 8时  col = 769
	* //所以进而确定行和列的取值范围
	*/
	int n = 0;
	scanf("%d",&n);
	int arr[400][800] = {{0,0,1,0,0},{0,1,0,1,0},{1,0,1,0,1}};
	int i, j = 0, k, row = 3, col = 5;
	for (i = 2; i <= n; i++)//n>=2时才使用二维数组进行排(方便依次的递增)
	{
		//先进行复制
		for (j = row; j < row * 2; j++)
		{
			for (k = 0; k < col;k++)
			{
				arr[j][k] = arr[j - row][k];//复制为左下方的三角形
				arr[j][k + col + 1] = arr[j][k];//再把左下到复制的,也复制到右下
			}
		}
		//因为最开始的三角形是靠近最左的,清空后再重新置放到左下和右下的中间
		//先清空
		for (j = 0; j < row;j++)
		{
			for (k = 0; k < col;k++)
			{
				arr[j][k] = 0;
			}
		}
		//放到中央(这时需要我们把之前已经复制好的左下三角形复制到中央(当然右下也可以,左下比较方便))
		for (j = 0; j < row;j++)
		{
			for (k = (col+1)/2;k<col+(col+1)/2;k++) //这里的 /2 是为了放置于中间
			{
				arr[j][k] = arr[j + row][k-((col+1)/2)]; //左下复制到中间
			}
		}

		//根据规律和递归思想 ,该树的变化和2次方有关系
		row *= 2;
		col = col*2 +1;//这里的加1是方便为了中间放置三角形
	}


	for (i = 0; i < row; i++)
	{//打印圣诞树
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == 0)
			{
				printf(" ");
			}
			else
			{
				printf("*");
			}
		}
		printf("\n");
	}

	//打印树柄
	for (i = 0; i < n;i++)
	{
		for (j = 0; j < col / 2;j++)
		{
			printf(" ");
		}
		printf("*\n");
	}
	return 0;
}

 

 题目解析超详细

因为这里的思想是使用二维数组来进行存储图案,然后发现随着输入数字的增大,圣诞树也是有一定规律的增大,这里有点像递归的思想。发现图案是由 一个个3行5列的三角组成的

接下来就进行一步一步来分析:

 

第一步  因为圣诞树的大小为 1- 8,所以我们要考虑二维数组的取值范围 ,避免数组大小不够

 

首先根据图案分析 他们的一次增长的行和列的规律,

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

分析上述 得到结论  

行数 与 n 的关系 超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

列数与 n 的关系     超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言 

这里我们取 n == 8    行数为 392,列数为 767

 

所以为了避免越界我们取 二维数组的范围  arr[400][800]

第二步 构造那个小三角  给二维数组部分初始化(先初始化一个小三角)【核心】

int arr[400][800] = {{0,0,1,0,0},{0,1,0,1,0},{1,0,1,0,1}};

初始时  3行  5列   

int i, j = 0, k, row = 3, col = 5;

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

 然后等到打印的时候,数字0表示 " ",数字1表示 ”*“

注意这里的起初三角就是 放在数组最左上方 ,因为根据组成指定的圣诞树,所以这里为了方便先进行 分别复制左下和右下边的三角形  ,然后 再把最左上那个三角形进行 想办法移动到中间。

 

1.把左下角和右下角的三角形复制过去 

		//先进行复制
		for (j = row; j < row * 2; j++)
		{
			for (k = 0; k < col;k++)
			{
				arr[j][k] = arr[j - row][k];//复制为左下方的三角形
				arr[j][k + col + 1] = arr[j][k];//再把左下到复制的,也复制到右下
			}
		}

 

图解

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

 

2.把最左上的三角先清空(置0),然后再把其重新复制到中间

		//因为最开始的三角形是靠近最左的,清空后再重新置放到左下和右下的中间
		//先清空
		for (j = 0; j < row;j++)
		{
			for (k = 0; k < col;k++)
			{
				arr[j][k] = 0;
			}
		}
		//放到中央(这时需要我们把之前已经复制好的左下三角形复制到中央(当然右下也可以,左下比较方便))
		for (j = 0; j < row;j++)
		{
			for (k = (col+1)/2;k<col+(col+1)/2;k++) //这里的 /2 是为了放置于中间
			{
				arr[j][k] = arr[j + row][k-((col+1)/2)]; //左下复制到中间
			}
		}

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言 

 如图

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

 这就是所要打印的图案

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言(当然必须是n>1)

 

 接着就是按照这样的思想,发现

 

		//根据规律和递归思想 ,该树的变化和2次方有关系
		row *= 2;
		col = col*2 +1;//这里的加1是方便为了中间放置三角形

再以 超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言为基准,当n = 3时 ,制作左下三角,制作右下三角

超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

总结就是这样每一次复制下去 

 然后把图形打印出来

	for (i = 0; i < row; i++)
	{//打印圣诞树
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == 0)
			{
				printf(" ");
			}
			else
			{
				printf("*");
			}
		}
		printf("\n");
	}

 

 第三步 打印树柄

打印星号的位置就是在 列的 1/2 处打印

	//打印树柄
	for (i = 0; i < n;i++)
	{
		for (j = 0; j < col / 2;j++)
		{
			printf(" ");
		}
		printf("*\n");
	}

 

最后 还是感谢网上大佬无私地分享题解,启发了我,虽然花费很久,但是收获也是很大的。 

 超级圣诞树(BC115) 【题解】超详细,【C语言】,算法,c语言

 

加油! 文章来源地址https://www.toymoban.com/news/detail-724920.html

到了这里,关于超级圣诞树(BC115) 【题解】超详细的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 圣诞节怎么能缺少圣诞树呢?Python+HTML打造专属于你的圣诞树

    前言: 美酒一杯让人醉,温馨陪伴浪漫随;雪花片片惹人爱,烦恼忧伤全不见;字里行间藏真情,文短情深送心愿:圣诞佳节快来到,祝大家永远开心幸福! Hello大家好,我是Dream。 圣诞节马上到了,一些朋友问我想送女朋友和男朋友们圣诞节礼物,但是也没想到啥好点子,作为

    2024年02月02日
    浏览(43)
  • python系列之(大家圣诞快乐)圣诞树

    2022年圣诞节到来啦,很高兴这次我们又能一起度过~, 圣诞节源自古罗马人迎接新年的农神节,与基督教本无关系。在基督教盛行罗马帝国后,教廷将这种民俗节日纳入基督教体系,同时以庆祝耶稣的降生。但在圣诞节这天不是耶稣的生辰,因为《圣经》未记载耶稣具体出生

    2024年02月04日
    浏览(35)
  • 【含源码】两种不同风格的圣诞树代码合集,其中还有可以改名字的圣诞树代码

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一年一度的圣诞节马上就要到了,看到好多程序员小伙伴已经开始炫耀自己制作的圣诞树了。今天就跟大家分享2种不同风格的圣诞树,附上完整代码,拿来即用可以按照自己的喜好来去运

    2024年02月02日
    浏览(36)
  • 打印圣诞树

    今天遇到一个不算特别变态的题目,可是却往错误的方向思考了有一会儿。 这是这个题目的链接:[打印圣诞树](圣诞树_牛客题霸_牛客网 (nowcoder.com)) 题目大致意思是,给定一个高度,打印出圣诞树。 效果图类似以下这种: 首先我把每片叶子看作是 5X3的矩形 ,空白看作是

    2023年04月12日
    浏览(46)
  • Python 圣诞树代码

    1.本章将会讲解Python编程 实现圣诞树效果! 2.圣诞节介绍 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节,天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期,《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人

    2024年02月03日
    浏览(37)
  • Python圣诞树代码

    2024年02月04日
    浏览(34)
  • 圣诞树(动态效果)

      1.复制代码到Dreamweaver或HBuilder或vscode中 2.点击运行---运行到浏览器---选择你要打开的浏览器 3.打开后会出现这个界面,前四个是固定音乐,最后一个是自主选择的音乐,你可以选择你电脑上的歌曲,什么歌曲都行(第一次打开可能会有点慢,稍等片刻即可,选择音乐的时候

    2024年02月04日
    浏览(35)
  • 【AE圣诞树代码】

    首发网站 天风的人工智能小站 1、圣诞树代码第一种 2、圣诞树代码第二种 3、修改记事本后缀为html 4、点击文件查看效果

    2024年02月04日
    浏览(42)
  • python圣诞树代码编程

    以下是一个简单的Python圣诞树代码: def draw_tree(height):     for i in range(height):         print(\\\' \\\' * (height - i - 1) + \\\'*\\\' * (2 * i + 1))     print(\\\' \\\' * (height - 1) + \\\'|\\\') draw_tree(10) 这个函数会绘制一个等腰三角形,其中每一行的星号数量从1开始,每次递增2,空格数量则相反,从等腰三

    2024年02月05日
    浏览(46)
  • 用Python画圣诞树

    我们的目标是将代码和素材全部隐藏起来,只需要双击一下鼠标就能自动带着BGM开始画圣诞树。 (这是电脑桌面上的一个文件,只需要双击一下,代码就会在后台自动运行了) (一秒后,就会看到弹出界面开始画圣诞树了,并且自动播放背景音乐哦) (再然后,就能看到画

    2023年04月18日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包