BC115 超级圣诞树(牛客网)|图形打印|二维数组打印|递归思想

一. 题目

原题 BC115 超级圣诞树(下面截图看不清的话可直接点链接看原题~)

描述

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

输入描述:

输入圣诞树的大小 nn
1≤n≤81≤n≤8

输出描述:

输出对应的圣诞树


二. 思路分析

  • 主要分为三部分:

  1. 根据对应的n,在数组对应位置中(即最顶部那个位置)存入最基础的情形(如下)

  * //其位置为tree[0][3*2^(n-1)-1];其他的都可由这个顶部坐标推出;
 * *
* * *
  1. 主体部分:递归思想的实现

  1. 每一次复制,都是将原来的图形复制给左下角右下角各一个;

  1. 每一次复制后,通过改变range的范围,将复制后得到的两个和原来的那个看作一个新的整体,再复制给下一个,是非常巧妙的设计,成果实现了递归思想。

  1. 打印部分(较简单):

  1. 打印圣诞树主体部分:通过找规律,确定圣诞树的长宽;

  1. 打印圣诞树树干部分:每行先打空格,再打*。


三. 代码实现

#include <stdio.h>
#include <math.h>

int main()
{
	char tree[400][800] = { 0 };//创建二维数组,以承载整个圣诞树的图案;
	int n, copy, i, j;//copy代表复制的次数,i代表行,j代表列;
	scanf("%d", &n);

	int top_y = 3 * pow(2, n - 1) - 1;//圣诞树顶点所在的列数
	                                  //(明确指出,是为了让最基础的图形,即圣诞树的前三层能在不同n时都放对在对应的位置上)
	//将n=1时的最基础的那个形状对应的图案,放入圣诞树数的第一层;
	//有助于后续复制的进行(递归思想,最简单的情形)
	tree[0][top_y] = '*';
	tree[1][top_y - 1] = '*';
	tree[1][top_y + 1] = '*';
	tree[2][top_y - 2] = '*';
	tree[2][top_y] = '*';
	tree[2][top_y + 2] = '*';

	
	for (copy = 1; copy < n; copy++)//代表复制的次数;
	{
		int range = 3 * pow(2, copy - 1);//很巧妙的设计——通过改变range,即复制的范围来实现递归——
		                                 //不断将复制得到的两个与原来的那个构成一个新的整体,再复制给下一层的两个;
		
		//复制出右下角和左下角的两个图案:
		for (i = 0; i < range; i++)
		{
			for (j = top_y - range + 1; j < top_y + range; j++)
			{
				tree[i + range][j - range] = tree[i][j];//tree[i + range][j - range]是左下角那个待复制的位置
				tree[i + range][j + range] = tree[i][j];//tree[i + range][j - range]是右下角那个待复制的位置
			}
		}
	}

	//打印圣诞树主体部分(不难,只要用表达式正确表达圣诞树长宽<-找规律总结得到,即可):
	for (i = 0; i < 3 * pow(2, n - 1); i++)
	{
		for (j = 0; j < 3 * pow(2, n); j++)
		{
			if ('*' == tree[i][j])
			{
				printf("*");
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}

	//打印树干的部分(简单):
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < top_y; j++)
		{
			printf(" ");
		}
		printf("*\n");
	}
	return 0;
}

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
回答: 归求解二维数组路径可以使用暴力归的方式。思路是,对于二维数组中的每一个点,记录其到终点(右下角点)的最小路径和。具体做法是,分别查看该点的正下方和右边两个点的值,选择其中较小的一个与数组原位置的值相加。最终,数组左上角位置的值即为问题的解。\[1\] #### 引用[.reference_title] - *1* [二维数组从左上到右下,返回最小路径和问题的解法](https://blog.csdn.net/z1171127310/article/details/127716640)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [LeetCode题目总结——二维数组](https://blog.csdn.net/weixin_40131652/article/details/108680706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [二维数组的最小路径和问题](https://blog.csdn.net/hotonyhui/article/details/126962888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值