牛客BC115 超级圣诞树

news2024/9/24 13:21:08

万众瞩目

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

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

牛客网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.coloradmin.cn/o/1324567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink Table API 与 SQL 编程整理

Flink API总共分为4层这里主要整理Table API的使用 Table API是流处理和批处理通用的关系型API&#xff0c;Table API可以基于流输入或者批输入来运行而不需要进行任何修改。Table API是SQL语言的超集并专门为Apache Flink设计的&#xff0c;Table API是Scala和Java语言集成式…

【数据结构】并查集的简单实现,合并,查找(C++)

文章目录 前言举例&#xff1a; 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount 二、源码 前言 需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规…

Unity的UI界面——Text/Image

编辑UI界面时&#xff0c;要先切换到2d界面 &#xff08;3d项目的话&#xff09; 1.Text控件 Text控件的相关属性&#xff1a; Character:&#xff08;字符&#xff09; Font&#xff1a;字体 Font Style&#xff1a;字体样式 Font Size&#xff1a;字体大小 Line Spac…

c语言力扣题目:消失的数字(有关时间复杂度O(N²)O(N))以及对异或操作符的更深入的理解(如何用人脑的十进制去考量二进制)

目录 Way One :暴力求解,时间复杂度为 O(N) 代码1 Way Two : 时间复杂度限制到 O(N) 代码及其详解 如题 Way One :暴力求解,时间复杂度为 O(N) 大体思路:比如这里我们需要处理的整型数组是"3,0,1",我们可以用冒泡排序或者 qsort函数将他从大到小进行排序成"…

【SQL】根据年份,查询每个月的数据量

根据年份&#xff0c;查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…

惯性导航基础知识学习----02惯性器件的误差和标定(下)

&#x1f308;武汉大学惯性导航课程合集是入门惯导的精品课程~ 作为导航路上的鼠鼠我&#xff0c;要开始学习惯性导航了~ 需要达到的要求是大致了解惯导的原理等~ 后期会陆续更新惯导相关的知识和笔记等~ &#x1f42c; 本blog为 武汉大学惯性导航课程 的记录~ 感谢团队提供的开…

Java中四种引用类型(强、软、弱、虚)

目录 引言 强引用&#xff08;Strong References&#xff09; 软引用&#xff08;Soft References&#xff09; 弱引用&#xff08;Weak References&#xff09; 虚引用&#xff08;Phantom References&#xff09; 引用类型的应用场景 总结 引言 Java中的引用类型是管理…

智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MA…

[Angular] 笔记 3:ngIf

ngIf 是 Angular 的行为指令。 基本写法&#xff1a;<div *ngIf"hero" class"name">{{ hero.name }} </div> 当 ngIf 表达式求值为 truthy 时&#xff0c;Angular会渲染在then子句中提供的模板&#xff1b;当为falsy 时&#xff0c;Angular会…

数显温度表 DHC15W AC110~240V 温度范围 -9+99度 导轨安装

一、概述 ​DHC15W数显温度表是一种高精度的温度测量仪器&#xff0c;采用数字显示技术&#xff0c;具有测量准确、稳定性高、操作简单、方便实用等优点。广泛应用于电子、冶金、化工、医药、食品等行业&#xff0c;适用于各种温度测量和监控场景。 二、产品特点 高精度测量&…

金蝶 Apusic 应用服务器任意文件上传漏洞

漏洞简介 金蝶 Apusic 应用服务器存在一个任意文件上传漏洞&#xff0c;攻击者可以通过构造恶意请求上传恶意文件到服务器&#xff0c;导致服务器失陷。 指纹识别 app“Apusic应用服务器” 漏洞复现 1.通过脚本构造应用zip压缩包&#xff1a; import zipfiletry:zipFile …

mysql创建用户和赋权

1.创建用户 CREATE USER new_userlocalhost IDENTIFIED BY user_password; “localhost"只允许本地连接&#xff0c;而”%"允许所有IP地址都可以连接到服务器。 2.赋权 GRANT ALL PRIVILEGES ON database_name.* TO new_userlocalhost; FLUSH PRIVILEGES; 3.给…

Linux线程——条件变量

什么是条件变量 条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时&#xff0c;允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量&#xff0c;其他线程…

Linux下c语言实现动态库的动态调用

在Linux操作系统下&#xff0c;有时候需要在不重新编译程序的情况下&#xff0c;运行时动态地加载库&#xff0c;这时可以通过Linux操作系统提供的API可以实现&#xff0c;涉及到的API主要有dlopen、dlsym和dlclose。使用时&#xff0c;需要加上头文件#include <dlfcn.h>…

Linux 操作系统(用户注册、删除、权限修改等)

添加用户 格式&#xff1a;useradd 用户名 ( 添加用户 ) passwd 用户名 (给用户设置密码) Linux 用户切换原则&#xff1a; 高权限向低权限切换无需输入密码 低权限向高权限或同级用户切换需要输入密码 用户切换&#xff1a;su su – 用户名 &#xff08;用户切换&#x…

Appium+Python自动化环境搭建实例教程

前言 appium可以说是做app最火的一个自动化框架&#xff0c;它的主要优势是支持android和ios&#xff0c;另外脚本语言也是支持java和Python。 小编擅长Python&#xff0c;所以接下来的教程是appiumpython的实例。 学习appium最大的难处在于环境的安装&#xff0c;从入门到真…

智能优化算法应用:基于混沌博弈算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混沌博弈算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混沌博弈算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混沌博弈算法4.实验参数设定5.算法结果6.…

K8s内容器拓扑图工具

1.背景&#xff1a;随着线上容器越来越多&#xff0c;需要一个可视化的方式展示各个容器之间的拓扑图。 2.需求&#xff1a;轻量级&#xff0c;部署方便。 3.部署 helm repo add groundcover https://helm.groundcover.com/ helm repo update helm install caretta --namespa…

springboot解决XSS存储型漏洞

springboot解决XSS存储型漏洞 XSS攻击 XSS 攻击&#xff1a;跨站脚本攻击(Cross Site Scripting)&#xff0c;为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆&#xff0c;故将跨站脚本攻击缩写为 XSS。 XSS(跨站脚本攻击)&#xff1a;是指恶意攻击者往 Web 页面里插…

2_js运算符与流程控制语句

1. 运算符的应用 1.1 算数运算符 浮点数的精度问题 浮点数值的最高精度是17位小数&#xff0c;不要直接判断两个浮点数是否相等。 var result 0.1 0.2; // 结果不是 0.3&#xff0c;而是&#xff1a;0.30000000000000004 console.log(0.07 * 100); // 结果不是 7&#…