1. 程式人生 > >PAT (Basic Level) Practice 1027 列印沙漏(20)

PAT (Basic Level) Practice 1027 列印沙漏(20)

此題連結: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;
}

 風靜靜的,小房間裡飄著電腦鍵盤的清脆聲和輕音樂聲,時間和距離被漸漸拉長,漫漫長路也許會就這樣不知不覺過去吧。

萬木春來