:pushpin: 新建文件 //這是要操作的文件名稱 string str_filename = "E:/data/t/haha.txt"; //創建一個流對象 o 就是從這個流對象出去, 出到哪裡, 當然是我們要建立的文件 ofstream ofs; //out會覆蓋 ofs.open(str_ ...
列印聖誕樹
今天遇到一個不算特別變態的題目,可是卻往錯誤的方向思考了有一會兒。
這是這個題目的鏈接:[](聖誕樹_牛客題霸_牛客網 (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");
}