PAT (Basic Level) Practice 1027 列印沙漏(20)
阿新 • • 發佈:2018-11-15
此題連結:https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328
1027 列印沙漏(20)(20 point(s))
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
我對題目的理解和注意點:
-
題目意思很好理解,給你正整數N(<=1000)和一個符號,要求你儘可能用掉最多的符號去列印沙漏(沙漏的形狀要好好揣摩),再最後一行輸出沒用掉的符號數(如果全用完了也要輸出數字 0)。
-
沙漏的形狀:我解題時是這樣分析的,沙漏最中間只有1個字元,第一個上下有6個字元,然後 後面的就有規律了都是比前一個多4個字元。
-
本題還要注意輸出空格的格式,字元之前是要有輸出空格來保證漏斗的形狀,但是字元後不需要輸出空格 ! 字元後不需要輸出空格 ! 字元後不需要輸出空格 ! (重要的事說三遍 !因為我在這栽了跟頭,提交了好多遍還是 Partially Accepted 起初以為是換行的問題,PTA如果像code forces那樣有具體的測試點就好,那樣會更快。)
程式碼:
#include<stdio.h> int main() { int a[23],b[23],sum=0,N; char c; scanf("%d %c",&N,&c); // -------------- a[0]=1; a[1]=6; b[0]=a[0]; b[1]=a[0]+a[1]; for(int i=2;i<23;i++) { a[i]=a[i-1]+4; } for(int i=0;i<23;i++) { b[i]=sum+a[i]; // 構建b陣列把每種沙漏要多少字元數都列起來。 sum=sum+a[i]; } //---------------- if(N<7) { printf("%c\n",c); printf("%d\n",N-1); // 如果小與7的情況。 } else { for(int i=1;i<23;i++) { if(N>=b[i]&&N<b[i+1]) { for(int j=0;j<(2*i+1);j++) { for(int l=0;l<(2*i+1);l++)//----------------------------------- { //列印上半段沙漏。 if(j<=(2*i+1)/2) { if(l>=j&&l<(2*i+1)-j) printf("%c",c); else { if(l<j) // 在字元前輸出空格。 printf(" "); } if(l==2*i) printf("\n"); } else // ------------------------------------- { // 列印下半段沙漏。 if(l>=(2*i+1)-j-1&&l<j+1) printf("%c",c); else { if(l<(2*i+1)-j-1) printf(" "); } if(l==2*i) printf("\n");// ---------------------------------------- } } } printf("%d\n",N-b[i]); } } } return 0; }
風靜靜的,小房間裡飄著電腦鍵盤的清脆聲和輕音樂聲,時間和距離被漸漸拉長,漫漫長路也許會就這樣不知不覺過去吧。
萬木春來