列印圣誕樹
今天遇到一個不算特別變態的題目,可是卻往錯誤的方向思考了有一會兒,
這是這個題目的鏈接:[](圣誕樹_牛客題霸_牛客網 (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");
}
最終效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549851.html
標籤:其他
上一篇:C++檔案處理
