草庐IT

打印圣诞树

saopigqwq233 2023-05-05 原文

打印圣诞树

今天遇到一个不算特别变态的题目,可是却往错误的方向思考了有一会儿。

这是这个题目的链接:[](圣诞树_牛客题霸_牛客网 (nowcoder.com))

题目大致意思是,给定一个高度,打印出圣诞树。

效果图类似以下这种:

错误示范

首先我把每片叶子看作是5X3的矩形,空白看作是3X3的矩形

最上面为第1层,最下面为第n层。

第i层前面有n-i个空矩形。

于是,我就想到了下面的代码:

#include"stdio.h"
void print_empty();//打印空矩形,只含一个printf函数
void print_53();//打印三角矩形,只含一个printf函数
int main()
{
    int n=0;
    scanf("%d",&n);//n是输入的圣诞树高度
    for(int i=1;i<n+1;i++)//到第i层
    {
        for(int j=0;j<n-i;j++)//第i层有n-i个空矩形
            print_empty();
        for(int j=0;j<i;j++)//第i层有i个53矩形
            print_53();
        printf("\n");
    }
    return 0;
}
void print_empty()
{
    printf("   \n"
           "   \n"
           "   \n");
}
void print_53()
{
    printf("  *  \n"
           " * * \n"
           "* * *\n");
}

突然我想到,在打印空矩形和53矩形时换了行,我要怎么保证两个矩形在同一行呢?

果不其然,结果成了这样。

而且,这种方式还有一个缺点,就是两个53矩形之间还有一行没考虑,自然更不可能得到正确答案。

正确姿势

代码

直接上代码,再解释:

#include <stdio.h>
void print_empty_3();//输出3个空格
void print_level(int l);//打印矩形第l行
int main()
{
    //不妨把圣诞树的每片三角形看作是 6X3 的矩形
    //把矩形看作一个元素,那么从上到下,共n层,从第一层开始看
    //第i层先有空白矩形n-i个,有三角形矩形i个

    //这样在每层的内部,还有三行,从上到下3行,从第一行开始看
    //第j行先有空白矩形行(n-i)个,之后有i个第j行矩形
    int n=0;
    scanf("%d",&n);
    for (int i = 1; i < n+1; ++i)//控制第几层
    {
        for (int j = 1; j <=3; ++j)//到了第i层的第j行,控制行
        {
            for (int k = 0; k < n-i; ++k) //第j行先有空白
            {
                print_empty_3();
            }
            for (int k = 0; k < i; ++k) //打印i个矩形第j行
            {
                print_level(j);
            }
            printf("\n");//每行输出完后换行
        }
    }
    //最后,还有一个高n行的树根
    //这个树根的位置在第nX3列
    for (int i = 0; i < n; ++i)//控制树根高度为n
    {
        for (int j = 0; j < n*3-1; ++j)
        {
            printf(" ");
        }
        printf("*\n");
    }
}
void print_empty_3()
{
    printf("   ");
}
void print_level(int l)
{
    if (1==l)
        printf("  *   ");
    else if(2==l)
        printf(" * *  ");
    else if(3==l)
        printf("* * * ");
}

解释

这个版本中,我将圣诞树的每片三角形看作是6X3的矩形,用以解决5X3矩形时两个矩形中间有缺口的问题

,并且把每层矩形再分为3行。

思路

树叶思路

从第一层开始从上往下共n层,第i层先有(n-i)个空矩形,i个六三矩形

每一层从第一行开始从上往下共3行,每行先打印(n-i)个单行空矩形,也就是(n-i)*3个空格

在打印第j行的单行矩形,这里用 void print_level(int l),函数接收第几行,就打印六三矩形的第几行,

一行打印完不忘换行 printf("\n");

树根思路

至于最后的树根,这个很简单,找规律即可:

当n=1时,树根长1,在占用行的第3个字符处;

当n=2时,树根长2,在占用行的第6个字符处;

当n=3时,树根长3,在占用行的第9个字符处;

所以,树根长n,在占用行的第n*3个字符处;

所以,来一个嵌套循环即可:

外层循环控制行,内层循环控制空格字符数,到n*3的位置时停止打印空格,打印“*”。

    for (int i = 0; i < n; ++i)//控制树根高度为n
    {
        for (int j = 0; j < n*3-1; ++j)
        {
            printf(" ");
        }
        printf("*\n");
    }

最终效果

有关打印圣诞树的更多相关文章

  1. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  2. ruby - 如何打印 ruby​​ 对象的实例变量 - 2

    classPacketdefinitialize(name,age,number,array)@name=name@age=age@number=number@neighbors=arrayendendp1=Packet.new("n1",5,2,[1,2,3,4])putsp1.name我有上面的代码,但是每当我执行puts语句时,我都会收到nameisnotamethod的错误。我不知道任何其他方式来打印p1的名称。如何打印姓名? 最佳答案 这里的问题是,虽然您拥有实例变量,但您并未使它们可访问。attr_reader:vari

  3. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  4. ruby - 如何以表格格式快速打印 Ruby 哈希值? - 2

    有没有办法快速将表格格式的ruby​​哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:

  5. Ruby-rspec - 如何打印出测试(组)名称 - 2

    如果我有一些测试,例如require_relative"Line"require_relative"LineParser"describeLinedoit"Canbecreated"doload"spec_helper.rb"@line.class.should==Lineendit"Canbeparsed"do...如何打印出测试组名称-在本例中为“Line”。我尝试添加:before:alldoputs"In#{self.class}"end但这给出了:InRSpec::Core::ExampleGroup::Nested_3,而不是Line 最佳答案

  6. Ruby—Open3.popen3/如何打印输出 - 2

    我有一个执行mysql的小ruby脚本导入方式:mysql-u-p-h,但利用Open3.popen3这样做。这就是我到目前为止所拥有的:mysqlimp="mysql-u#{mysqllocal['user']}"mysqlimp这实际上是在做工作,但有一件事困扰着我,与我希望看到的输出有关。如果我将第一行更改为:mysqlimp="mysql-v-u#{mysqllocal['user']}"#notethe-v然后整个脚本永远挂起。我猜,发生这种情况是因为读流和写流相互阻塞,我也猜想stdout需要定期冲洗,以便stdin将继续被消耗。也就是说,只要stdout的buffer已满

  7. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

  8. ruby - 哈希的简单打印 key ? - 2

    很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。我想从给定的哈希键中打印出一个键,但找不到简单的解决方案:myhash=Hash.newmyhash["a"]="bar"#notworkingmyhash.fetch("a"){|k|putsk}#working,butuglyifmyhash.has_key("a")?puts"a"end还有其他办法吗?

  9. ruby - 打印一个范围内的数字 - 2

    我正在尝试使用以下代码打印1到50之间的所有数字:[1..50].each{|n|putsn}但是控制台打印[1..50]我想打印这样的东西1个2个3个4个...50 最佳答案 试试下面的代码:(1..50).each{|n|putsn}问题是您使用的是[]定界符而不是()定界符。 关于ruby-打印一个范围内的数字,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/14528573

  10. ruby-on-rails - 有没有办法在 Rails 中以编程方式查看(或打印)方法定义? - 2

    假设我在我的Rails应用中某处定义了一个名为bla的函数。在ruby​​或rails中有没有一种方法可以动态/以编程方式打印用于定义该函数的代码?例如:defblaputs"HiThere"end然后如果我调用一个函数,例如get_definition:putsget_definition(:bla)这会打印出来"puts\"HiThere\""有规范的方法吗?我以前实际上不需要这样做,而且我知道这在Rails中并不是很常见的做法。我也不想使用元(反射)编程定义我的方法,然后存储用于定义我的方法的字符串。感谢您的帮助! 最佳答案

随机推荐