PAT Basic 1109. 擅长C

发布时间 2023-04-18 19:54:04作者: 十豆加日月

PAT Basic 1109. 擅长C

1. 题目描述:

当你被面试官要求用 C 写一个“Hello World”时,有本事像下图显示的那样写一个出来吗?

HWC.jpg

2. 输入格式:

输入首先给出 26 个英文大写字母 A-Z,每个字母用一个 \(7×5\) 的、由 C. 组成的矩阵构成。最后在一行中给出一个句子,以回车结束。句子是由若干个单词(每个包含不超过 10 个连续的大写英文字母)组成的,单词间以任何非大写英文字母分隔。

题目保证至少给出一个单词。

3. 输出格式:

对每个单词,将其每个字母用矩阵形式在一行中输出,字母间有一列空格分隔。单词的首尾不得有多余空格。

相邻的两个单词间必须有一空行分隔。输出的首尾不得有多余空行。

4. 输入样例:

..C..
.C.C.
C...C
CCCCC
C...C
C...C
C...C
CCCC.
C...C
C...C
CCCC.
C...C
C...C
CCCC.
.CCC.
C...C
C....
C....
C....
C...C
.CCC.
CCCC.
C...C
C...C
C...C
C...C
C...C
CCCC.
CCCCC
C....
C....
CCCC.
C....
C....
CCCCC
CCCCC
C....
C....
CCCC.
C....
C....
C....
CCCC.
C...C
C....
C.CCC
C...C
C...C
CCCC.
C...C
C...C
C...C
CCCCC
C...C
C...C
C...C
CCCCC
..C..
..C..
..C..
..C..
..C..
CCCCC
CCCCC
....C
....C
....C
....C
C...C
.CCC.
C...C
C..C.
C.C..
CC...
C.C..
C..C.
C...C
C....
C....
C....
C....
C....
C....
CCCCC
C...C
C...C
CC.CC
C.C.C
C...C
C...C
C...C
C...C
C...C
CC..C
C.C.C
C..CC
C...C
C...C
.CCC.
C...C
C...C
C...C
C...C
C...C
.CCC.
CCCC.
C...C
C...C
CCCC.
C....
C....
C....
.CCC.
C...C
C...C
C...C
C.C.C
C..CC
.CCC.
CCCC.
C...C
CCCC.
CC...
C.C..
C..C.
C...C
.CCC.
C...C
C....
.CCC.
....C
C...C
.CCC.
CCCCC
..C..
..C..
..C..
..C..
..C..
..C..
C...C
C...C
C...C
C...C
C...C
C...C
.CCC.
C...C
C...C
C...C
C...C
C...C
.C.C.
..C..
C...C
C...C
C...C
C.C.C
CC.CC
C...C
C...C
C...C
C...C
.C.C.
..C..
.C.C.
C...C
C...C
C...C
C...C
.C.C.
..C..
..C..
..C..
..C..
CCCCC
....C
...C.
..C..
.C...
C....
CCCCC
HELLO~WORLD!

5. 输出样例:

C...C CCCCC C.... C.... .CCC.
C...C C.... C.... C.... C...C
C...C C.... C.... C.... C...C
CCCCC CCCC. C.... C.... C...C
C...C C.... C.... C.... C...C
C...C C.... C.... C.... C...C
C...C CCCCC CCCCC CCCCC .CCC.

C...C .CCC. CCCC. C.... CCCC.
C...C C...C C...C C.... C...C
C...C C...C CCCC. C.... C...C
C.C.C C...C CC... C.... C...C
CC.CC C...C C.C.. C.... C...C
C...C C...C C..C. C.... C...C
C...C .CCC. C...C CCCCC CCCC.

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

很有意思的题目,AC后跟孩子第一次跑通数码管的心情是一样的。定义三维字符数组letter用于存储每个字母的矩阵形式,letter的三个维度为26、LETTER_ROWLETTER_COL+1,分别代表大写字母个数、矩阵形式的行数、矩阵形式的列数+1(+1是为了存储空字符'\0'),这里直接将矩阵形式的每一行当作字符串读入,方便输入输出。然后就是对输入最后一行的句子的处理,题目没有说明句子的长度上限,只说明”句子由若干个单词组成,且每个单词包含不超过10个连续的大写字母,单词间以任何非大写英文字母分隔”,因为可能由空格符分隔,所以不能使用scanf()输入,这里我采用逐字符输入的方法,类似之前压缩字符串PAT Basic 1078. 字符串压缩与解压 的思路,遇到大写字母时就进行计数,否则就进行输出。这里定义int型数组letterRec记录每个单词中依次出现的字母,int型变量letterCount记录字母个数。其他需要注意的地方:

  • 每个单词的矩阵形式需要逐行输出,在每一行中把此单词所有字母的当前行进行输出。
  • 空白列和空白行的处理,每行输出时除了第一个字母都需要添加空白列,每个单词输出时除了第一个单词都需要添加空白行,这里我定义变量firstBlood标记是否输出了第一个单词。
  • 这里逐字符进行输入,直到遇到换行符'\n'为止,需要在开始输入前调用getchar()消耗掉倒数第二行末尾的换行符以保证输入正常,另外最后一个单词后面可能没有分隔符,记得进行尾处理。

My Code:

#include <stdio.h>

#define LETTER_ROW 7
#define LETTER_COL 5

int main(void)
{
    char letter[26][LETTER_ROW][LETTER_COL+1];
    int i=0, j=0; // iterator
    char tempCh = 0;
    int letterRec[10] = {0};
    int letterCount=0;
    int firstBlood=0; // flag of first word;
    
    for(i=0; i<26; ++i)
    {
        for(j=0; j<LETTER_ROW; ++j)
        {
            scanf("%s", letter[i][j]);
        }
    }
    
    
    letterCount = 0;
    getchar(); // consume '\n' before last line
    while((tempCh=getchar()) != '\n')
    {
        //printf("%c", tempCh);
        if(tempCh>='A' && tempCh<='Z') // count the letter
        {
            letterRec[letterCount++] = tempCh-'A';
        }
        else // need to output
        {
            if(letterCount)
            {
                if(!firstBlood) firstBlood=1;
                else printf("\n"); // get a new line if not a first word
                
                for(j=0; j<LETTER_ROW; ++j)
                {
                    for(i=0; i<letterCount; ++i)
                    {
                        if(!i) printf("%s", letter[letterRec[i]][j]);
                        else printf(" %s", letter[letterRec[i]][j]);
                    }
                    printf("\n");
                }
                
                letterCount = 0;
                
            }
        }
    }
    
    if(letterCount)
    {
        // tail handle
        if(!firstBlood) firstBlood=1;
        else printf("\n"); // get a new line if not a first word
        
        for(j=0; j<LETTER_ROW; ++j)
        {
            for(i=0; i<letterCount; ++i)
            {
                if(!i) printf("%s", letter[letterRec[i]][j]);
                else printf(" %s", letter[letterRec[i]][j]);
            }
            printf("\n");
        }
        letterCount = 0;
    }
    
    
//     for(k=0; k<5; ++k) // output test
//     {
//         for(i=0; i<LETTER_ROW; ++i)
//         {
//             for(j=0; j<5; ++j)
//             {
//                 printf("%s ", letter[k*5+j][i]);
//             }
//             printf("\n");
//         }
//         printf("\n");
//     }
    
    
    return 0;
}