打印圣誕樹
今天遇到一個不算特別變態(tài)的題目,可是卻往錯誤的方向思考了有一會兒。
這是這個題目的鏈接:[打印圣誕樹](圣誕樹_??皖}霸_??途W(wǎng) (nowcoder.com))
題目大致意思是,給定一個高度,打印出圣誕樹。
效果圖類似以下這種:
錯誤示范
首先我把每片葉子看作是5X3的矩形,空白看作是3X3的矩形。
最上面為第1層,最下面為第n層。
第i層前面有n-i個空矩形。
于是,我就想到了下面的代碼:
#include"stdio.h"
void print_empty();//打印空矩形,只含一個printf函數(shù)
void print_53();//打印三角矩形,只含一個printf函數(shù)
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矩形時換了行,我要怎么保證兩個矩形在同一行呢?
果不其然,結(jié)果成了這樣。
而且,這種方式還有一個缺點,就是兩個53矩形之間還有一行沒考慮,自然更不可能得到正確答案。
正確姿勢
代碼
直接上代碼,再解釋:
#include <stdio.h>
void print_empty_3();//輸出3個空格
void print_level(int l);//打印矩形第l行
int main()
{
//不妨把圣誕樹的每片三角形看作是 6X3 的矩形
//把矩形看作一個元素,那么從上到下,共n層,從第一層開始看
//第i層先有空白矩形n-i個,有三角形矩形i個
//這樣在每層的內(nè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)
,函數(shù)接收第幾行,就打印六三矩形的第幾行,
一行打印完不忘換行 printf("\n");
。
樹根思路
至于最后的樹根,這個很簡單,找規(guī)律即可:
當n=1時,樹根長1,在占用行的第3個字符處;
當n=2時,樹根長2,在占用行的第6個字符處;
當n=3時,樹根長3,在占用行的第9個字符處;
所以,樹根長n,在占用行的第n*3個字符處;
所以,來一個嵌套循環(huán)即可:
外層循環(huán)控制行,內(nèi)層循環(huán)控制空格字符數(shù),到n*3的位置時停止打印空格,打印“*”。文章來源:http://www.zghlxwxcb.cn/news/detail-411735.html
for (int i = 0; i < n; ++i)//控制樹根高度為n
{
for (int j = 0; j < n*3-1; ++j)
{
printf(" ");
}
printf("*\n");
}
最終效果
文章來源地址http://www.zghlxwxcb.cn/news/detail-411735.html
到了這里,關于打印圣誕樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!