PAT Basic 1052. 卖个萌
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
// }