PAT Basic 1052. 卖个萌

发布时间 2023-03-25 23:03:28作者: 十豆加日月

PAT Basic 1052. 卖个萌

1. 题目描述:

萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:

[左手]([左眼][口][右眼])[右手]

现给出可选用的符号集合,请你按用户的要求输出表情。

2. 输入格式:

输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []内。题目保证每个集合都至少有一个符号,并不超过 10 个符号;每个符号包含 1 到 4 个非空字符。

之后一行给出一个正整数 K,为用户请求的个数。随后 K 行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从 1 开始),数字间以空格分隔。

3. 输出格式:

对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出 Are you kidding me? @\/@

4. 输入样例:

[╮][╭][o][~\][/~]  [<][>]
 [╯][╰][^][-][=][>][<][@][⊙]
[Д][▽][_][ε][^]  ...
4
1 1 2 2 2
6 8 1 5 5
3 3 4 3 3
2 10 3 9 3

5. 输出样例:

╮(╯▽╰)╭
<(@Д=)/~
o(^ε^)o
Are you kidding me? @\/@

6. 性能要求:

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

思路:

考察基础IO,不能算除草题吧。。。主要在于手、眼、口可选符号集的输入,一开始我打算每次用fgets()读入一行,然后利用sscanf()不断读入表情符号(代码末尾注释部分),但是从字符串temp读入时是没有缓冲机制的,所以这种方法失败。后来只能用tempCh=getchar()逐字符读入,维护好flag标志即可。

符号集读入成功后就基本解决了,只需要输出时判断下所选序号是否存在即可,这里我第一次提交时testpoint1, 2报wrong answer,检查后发现没有对序号下限进行判断(emoTemp[j] <= 0),改过来后AC。

My Code:

#include <stdio.h>

int main(void)
{
    char emoji[3][10][5] = {0};
    //char temp[61];
    char tempCh;
    int numCount = 0;
    int emoTemp[5] = {0};
    int emoBound[5] = {0};
    int i=0;
    int j=0;
    int flag=0; // flag of store emoji
    int k=0;
    char emoKid[] = "Are you kidding me? @\\/@";
    
    for(i=0; i<3; ++i)
    {
        j=0;
        flag=0;
        while((tempCh=getchar()) != '\n')
        {
            if(!flag && tempCh=='[')
            {
                flag = 1; // start store emoji
                k = 0;
            }
            else if(flag && tempCh==']')
            {
                emoji[i][j][k] = '\0';
                flag = 0; // end store emoji
                ++j; // emoji count increase
            }
            else if(flag)
            {
                emoji[i][j][k] = tempCh;
                ++k;
            }
        }
        
        emoBound[i] = j; //store emoji count
    }
    emoBound[3] = emoBound[1];
    emoBound[4] = emoBound[0];
    
    scanf("%d", &numCount);
    for(i=0; i<numCount; ++i)
    {
        for(j=0; j<5; ++j)
        {
            //printf("%d ", emoBound[j]);
            scanf("%d", &emoTemp[j]);
            // here first submit testpoint1, 2 wrong answer, for I forgot to judge the lower bound.
            if(emoTemp[j] > emoBound[j] || emoTemp[j] <= 0) 
            {
                break;
            }
        }
        if(j<5) // select number not exist
        {
            printf("%s\n", emoKid);
        }
        else
        {
            printf("%s(%s%s%s)%s\n", emoji[0][emoTemp[0]-1], emoji[1][emoTemp[1]-1], emoji[2][emoTemp[2]-1], emoji[1][emoTemp[3]-1], emoji[0][emoTemp[4]-1]);
        }
    }
    
//     for(j=0; j<emoBound[0]; ++j) // test input is correct
//     {
//         printf("%s\n", emoji[0][j]);
//     }
    
    
    return 0;
}

//     for(i=0; i<3; i++)
//     {
//         fgets(temp, 61, stdin);
//         j=0;
//         //int sscanf(const char *str, const char *format, ...)
//         while(sscanf(temp, "[%s]", emoji[i][j]))
//         {
//             j++;
//         }
//         emoBound[i] = j; //emoji count
//     }