牛客BC115 超级圣诞树

万众瞩目

在上一篇我们介绍了一个圣诞树的打印,而这道题与上次不同的是他的基本单位是一直在变的

我建议先把上一个搞懂在写这道题这个。

牛客网BC114 圣诞树-CSDN博客

ok那么正文开始

题目如下

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

输入描述:

输入圣诞树的大小为n

1≤n≤8

输出描述:

输出对应的圣诞树

样例一:

输入:1
输出:** *
* * **

样例二:

输入:2
输出:** ** * **     ** *   * *
* * * * * ***

样例三:

输入:3
输出:** ** * **     ** *   * ** * * * * **           ** *         * ** * *       * * **     *     *     ** *   * *   * *   * *
* * * * * * * * * * * ****

样例四:

输入:4
输出:** ** * **     ** *   * ** * * * * **           ** *         * ** * *       * * **     *     *     ** *   * *   * *   * ** * * * * * * * * * * **                       ** *                     * ** * *                   * * **     *                 *     ** *   * *               * *   * ** * * * * *             * * * * * **           *           *           ** *         * *         * *         * ** * *       * * *       * * *       * * **     *     *     *     *     *     *     ** *   * *   * *   * *   * *   * *   * *   * *
* * * * * * * * * * * * * * * * * * * * * * * *****

代码解析:

1.与上次相比我们的基本单位是一直变化的,也就是输入不同的数字,我们要先找到这个基本单位才行

2.可以发现输入n对应的基本单位就是n-1对应的图,所以可以先用循环找到基本单位

3.再找基本单位后要多次使用它,所以要先把基本单位存起来方便使用,我用的方法是二维数组。

ok有了以上的基本思路就可以开始敲代码了。

注意:一个基本变量变为下一个基本变量的过程如下

一.找基本单位

    int row = 3, column = 6;//基本单位的行列int arr[100][200] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };//存一个最小的基本变量int count;scanf("%d", &count);for (int i = 1; i < count; i++)//我们知道输入n对应的图形其实也是n+1的基本单位所以我这个循环可以直接得到我们要找的图形{for (int j = row, J = 0; j < 2 * row; j++, J++)for (int k = 0; k < column; k++){arr[j][k] = arr[J][k];//这个是左下arr[j][k + column] = arr[J][k];//这个是右下arr[J][k] = '\0';这个是消除原本储存的基本单位,}
//可以发现n的基本单位是由三个n-1的基本单位构成的,分别位于左上,右下,中上for (int j = 0, J = row; j < row; j++, J++){for (int k = 0; k < column; k++)arr[j][k + column / 2] = arr[J][k];//这个是中上}row *= 2;//基本单位变大,记录的行列也要变化column *= 2;}

二.打印树

二维数组存储了我们的目标图形,直接打印,但要注意,我们要把数组对应元素是'\0'的打印为空格,不然你的图形就会缺一块少一块的,我的处理方法是个三目操作符来判断。

    for (int i = 0; i < row; i++){for (int j = 0; j < column; j++)printf("%c", arr[i][j] == '\0' ? ' ' : arr[i][j]);printf("\n");}

三.打印树根

打印树根就简单了,只要直到树根在中间就行。

    for (int i = 0; i < count; i++){for (int j = 0; j < column / 2 - 1; j++)printf(" ");printf("*\n");}

答案如下

#include<stdio.h>
int main()
{int row = 3, column = 6;int arr[400][1000] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };int count;scanf("%d", &count);for (int i = 1; i < count; i++){for (int j = row, J = 0; j < 2 * row; j++, J++)for (int k = 0; k < column; k++){arr[j][k] = arr[J][k];arr[j][k + column] = arr[J][k];arr[J][k] = '\0';}for (int j = 0, J = row; j < row; j++, J++){for (int k = 0; k < column; k++)arr[j][k + column / 2] = arr[J][k];}row *= 2;column *= 2;}for (int i = 0; i < row; i++){for (int j = 0; j < column; j++)printf("%c", arr[i][j] == '\0' ? ' ' : arr[i][j]);printf("\n");}for (int i = 0; i < count; i++){for (int j = 0; j < column / 2 - 1; j++)printf(" ");printf("*\n");}return 0;
}

但是!!!!!!!

这个写法有个问题是

由于我们把要打印的n对应的图形存了进去使得内存消耗很大,下图牛客上给的

所以我们还有一种思路,就是找到n的基本单位,然后用类似于上一道题(就上一篇博客)的方法写出来

解析写在注释里了

#include<stdio.h>
int main()
{int row = 3, column = 6;int arr[200][400] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };int count;scanf("%d", &count);if (count > 1){for (int i = 1; i < count - 1; i++)//这里是count-1说明找的是n的基本单位,而不是n本身{for (int j = row, J = 0; j < 2 * row; j++, J++)for (int k = 0; k < column; k++){arr[j][k] = arr[J][k];arr[j][k + column] = arr[J][k];arr[J][k] = '\0';}for (int j = 0, J = row; j < row; j++, J++){for (int k = 0; k < column; k++)arr[j][k + column / 2] = arr[J][k];}row *= 2;column *= 2;}
//这些找基本单位过程与上一个方法一样,for (int I = 0; I < row; I++){for (int i = 0; i < column / 2; i++)printf(" ");for (int i = 0; i < column; i++)printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);printf("\n");}
//可以发现要打印的图形都可以分为上下两部分
//这个是上面的,需要先打空格for (int I = 0; I < row; I++){for (int i = 0; i < column; i++)printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);for (int i = 0; i < column; i++)printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);printf("\n");}
//这个是下面的两个基本单位构成的,不用先打空格,而且由于是两个,所以里面放了两个for循环for (int i = 0; i < count; i++){for (int j = 0; j < column - 1; j++)printf(" ");printf("*\n");}
//打印树根}else//此方法需要将n=1设置为特例,因为找不到他的基本单位printf("  *\n * * \n* * *\n  *");return 0;
}

很明显占用内存小了很多

总结

ok,那么牛客上两道打印圣诞树的题的就完成了,看完记得的自己动手试试瞧瞧代码哦

感觉有用的话就点个赞支持一下吧,谢谢啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288769.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串逆序输出

逆序输出就是本来abc输出的&#xff0c;然后我想让他输出成cba&#xff0c;那么我们还是要用到for循环&#xff0c;只不过原先是从零开始往上加&#xff0c;这回呢&#xff0c;是从上面往下减 我们观察上面这个图片&#xff0c;我们想要输出olleh&#xff0c;那么我们就要从4开…

甘草书店:#12 2023年12月18日 星期一 晴 创业分享:「甘草书店之于甘草创投的意义」

尽管甘草书店的初衷简单而纯粹&#xff0c;就是在做很多书店人都在做的“书店”&#xff0c;只不过我这里加的是创业投资。但社会和市场更喜欢从反方向提问&#xff1a;你做创投就做创投&#xff0c;为什么要开家书店&#xff1f; 对于我个人&#xff0c;当然有一套自我说服的…

[PyTorch][chapter 8][李宏毅深度学习][Back propagation]

前言&#xff1a; 反向传播算法(英:Backpropagation algorithm&#xff0c;简称:BP算法)是一种监督学习算法&#xff0c;常被用来训练多层感知机。 它用于计算梯度计算中&#xff0c;降低误差。 目录&#xff1a; 链式法则 模型简介&#xff08;Model&#xff09; 损失函…

Java实现限流算法

下面是一个使用Java实现的令牌桶算法的例子&#xff1a; import java.util.concurrent.atomic.AtomicLong;public class RateLimiter {private final long capacity; // 令牌桶容量private final long rate; // 令牌生成速率private AtomicLong tokens; // 当前令牌数量privat…

RAII智能指针

RAII resource acquisition is initialization RAII是利用对象声明周期来控制程序资源的简单技术 在对象构造时获取资源&#xff0c;控制着对资源的访问使之在对象的生命周期内始终保持有效&#xff0c;最后在对象析构的时候释放资源。借此&#xff0c;我们实际上把管理一份资源…

2024Web自动化测试的技术框架和工具有哪些?

Web 自动化测试是一种自动化测试方式&#xff0c;旨在模拟人工操作对 Web 应用程序进行测试。这种测试方式可以提高测试效率和测试精度&#xff0c;减少人工测试的工作量和测试成本。在 Web 自动化测试中&#xff0c;技术框架和工具起着至关重要的作用。本文将介绍几种常见的 W…

VM安装Sonoma【笔记】

VMware Workstation安装MacOS Sonoma 1、配置虚拟机&#xff0c;根据系统性能调整参数&#xff1b; 2、先不焦急启动虚拟机&#xff0c;打开虚拟机存储目录&#xff0c;以文本方式打开.vmx文件&#xff08;这里以Sonoma.vmx为例&#xff09;&#xff1b; 这里只针对Inter CP…

vue-springboot二手图书商城交易系统ij5dr

本系统依赖于MySQL数据库来储存信息&#xff0c;系统完成后&#xff0c;所有需要的数据都要从数据库中读取&#xff0c;这也意味着无论是插入、更新还是删除操作&#xff0c;只要对数据有改动的操作都需要与数据库交互&#xff0c;因此&#xff0c;系统的全部数据都要储存在数据…

C++相关闲碎记录(18)

1、strftime()的转换指示器 #include <locale> #include <chrono> #include <ctime> #include <iostream> #include <exception> #include <cstdlib> using namespace std;int main () {try {// query local time:auto now chrono::syste…

Python 多维数组详解(numpy)

文章目录 1 概述1.1 numpy 简介1.2 ndarray 简介 2 数组操作2.1 创建数组&#xff1a;array()2.2 裁切数组&#xff1a;切片2.3 拼接数组&#xff1a;concatenate()2.4 拆分数组&#xff1a;array_split()2.5 改变数组形状&#xff1a;reshape() 3 元素操作3.1 获取元素&#x…

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

【QT】解决QTableView修改合并单元格内容无法修改到合并范围内的单元格

问题:修改合并单元格的内容 修改合并单元格的内容时,希望直接修改到合并范围内的单元格,Qt没有实现这个功能,需要自己写出 Delegate来实现 方案:Delegate class EditDelegate : public QStyledItemDelegate {public:EditDelegate(QTableView *view): tableView(view){}pu…