xtu oj Patchouli的金字塔
生活随笔
收集整理的這篇文章主要介紹了
xtu oj Patchouli的金字塔
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Patchouli想要繪制一個金字塔。金字塔的圖案由n個正三角形和倒三角形堆疊而成,具體的繪制方法如下:
-
每個三角形由*,/,\和-組成,分別代表三角形的頂點和三條邊。
-
第一行只包含一個正三角形,其余各行的三角形按照”正三角形,倒三角形,正三角形,倒三角形,…… “的順序緊致排列。
-
除最后一行外,每一行的三角形比上一行多2個。一共輸出n個三角形。
例如,n=1時,圖案如下:
*/ \ * - *n=2時,圖案如下:
*/ \* - */ \ * - *n=3時,圖案如下:
*/ \* - */ \ / * - *n=7時,圖案如下:
*/ \* - */ \ / \* - * - */ \ / \ * - * - *Patchouli想知道n個三角形組成的金字塔的圖案是怎樣的?
輸入
第一行包含一個正整數T(1≤T≤100),表示樣例的個數。 接下來的T行,每行包含一個正整數n(1≤n≤100),表示金字塔中的三角形的個數。
輸出
對于每個樣例輸出對應的圖案。每行的行末不包含多余的空格
思路:比如輸入6,應該有3層,我是先將前2層打印,因為這樣有規律一下,而對于第三層,我是分情況進行分類討論,比如第三層第一個,第三層第二個,總的來說,圖形題目的核心就是分段打印!!!把有規律的先用循環打印出來,不容易用循環實現的就分類討論?
#include <stdio.h> #include <math.h> void function() {printf("/ \\");} int judge(int n) {int ceng, k,m;for (ceng = 0, k = n; k > 0; ceng++, k = k - m) {m = 2 * ceng + 1;//如果說畫兩層,那么在n=2,n=3,n=4的情況下//2-1>0,1-5<0,但已經ceng++了,所以是兩層//n為5的時候,k = 5,k>0,ceng = 0,m = 1,然后k =5>0,ceng++=1,k = 4;// m = 2*1+1=3,k = 4>0,ceng++=2,k = 4-3= 1.m =2*2+1=5;//繼續判斷,k = 1>0,ceng++ = 3,k = 4-5= -1,m = 2*3+1=7,k<0,退出循環//ceng =3,//原理是輸入的n所在某一行的包括前面總的三角形數,依次減除開這一行的前面的總的三角形再減去下一層,根據循環的運行順序所得到的次數就可以得到}return ceng; } void normalprf(int ceng) {//當前行數int cnt = 0;int hangbf = ((ceng - 1) * 2 + 1);//打印前面的//printf("上一層的行數%d\n", hangbf);for (int i = 0; i < hangbf; i++) {//開始打印前面幾行的printf(" ");for (int a = hangbf - 2 - i; a >= 0; a--) {printf(" ");//空格輸出完畢}//空格正常打印n-1層的,但是為了保證和n層的對齊,所以相當于每一次都在前面多輸出兩個空格cnt = i / 2;if (i == 0) {printf("*");}if ((i % 2 == 0) && i != 0) {printf("*");for (int j = 0; j < cnt; j++) {printf(" - *");}}else if ((i - 1) % 2 == 0) {for (int b = 0; b < (i - 1) / 2; b++) {printf("/ \\ ");}printf("/ \\");}printf("\n");} } //這個函數是用來打印前面的行數,但是空格一定要正常打印!!! int main() {int t;scanf("%d", &t);while (t--) {int i, count, num;int n, ceng, k, m, flag = 0;scanf("%d", &n);//行數需要分析,n=1時,為3行,之后變為5行,且要輸入3個數據后才能變為7行//之后要輸入5個數據后才能變為9行//可以在for循環中多定義幾個變量來進行行數控制//先不急找到i<多少,先找到畫多少層數ceng = judge(n);//判斷有多少層的函數int hang = 2 * ceng + 1;//printf("層數為%d 行數為%d\n", ceng, hang);while (1) {n--;//先將指向n的指針向左邊移動,if (judge(n) != ceng) {//如果說n返還的層數不等于最開始的層數,說明遍歷到上一層去了n++;//回到--前的數,break;//}else flag++;//說明同行某數前面有多少個數}flag++;//說明該數在同行第幾個數,也就是第幾個三角形//printf("該數據在第%d層第%d個數據\n", ceng, flag);//前面行數隨便打印就可以了,打印滿就行了//目前的問題打印前面幾行時,雖然說是打印前面幾行,但空格必須是當前的行數,也就是說空格是前面幾行的下行的空格normalprf(ceng);//成功打印了前面一個階段的正常情況//現在對輸入的該三角形數量是某行的第幾個數進行特殊處理//首先控制沒有*的地方printf(" / \\");int o=1;while (1) {if (o > 1) {if (o % 2 == 0) {printf(" /");}else {printf(" \\");}}o++;if (o == flag + 1) {break;}}printf("\n");o = 1;printf("* - *");while (1) {if (o > 1) {if (o % 2 == 0) {printf("");}else {printf(" - *");}}o++;if (o == flag + 1) {break;}}printf("\n");}}總結
以上是生活随笔為你收集整理的xtu oj Patchouli的金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】求三角形面积
- 下一篇: 最新pr值大于6的网站大全