PAT 乙级 1052.卖个萌 C++/Java
萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]
现给出可选用的符号集合,请你按用户的要求输出表情。
输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []
内。题目保证每个集合都至少有一个符号,并不超过 10 个符号;每个符号包含 1 到 4 个非空字符。
之后一行给出一个正整数 K,为用户请求的个数。随后 K 行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从 1 开始),数字间以空格分隔。
输出格式:
对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出 Are you kidding me? @\/@
。
输入样例:
[╮][╭][o][~\][/~] [<][>]
[╯][╰][^][-][=][>][<][@][⊙]
[Д][▽][_][ε][^] ...
4
1 1 2 2 2
6 8 1 5 5
3 3 4 3 3
2 10 3 9 3
输出样例:
╮(╯▽╰)╭
<(@Д=)/~
o(^ε^)o
Are you kidding me? @\/@
思路:
1、由于第三行输入末尾有空格,无法使用cin,要使用getline;
2、对于前三行输入,使用子函数choose()提高效率。
函数介绍:定义两个标识符flag和finish,当识别到字符串中的字符为'['时,flag为true,进入下一字符,将字符添加到临时string变量temp中,直到遇见字符']'结束添加,此时finish改为true,flag改为false,将添加完毕的temp字符放进数组中,添加完毕后finish改为false,temp清空。
3、对于第4行及接下来的输入,要设一个上限和下限,满足条件则输出,不满足则输入"Are you kidding me? @\\/@",这里要注意 ’\‘ 默认转义字符,无法直接输出,要在前面多加一个 '\'。
4、VS2019无法直接输出样例第一个表情,对于这些特殊字符,会将它们视为空集。所以我没管它,其他行的答案正确,说明思路是对的,直接放到pat能过就好。
C++实现:
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 using namespace std; 5 6 vector<string> choose(string s) { 7 bool flag = false, finish = false; 8 string temp = ""; 9 vector<string> res; 10 for (int i = 0; i < s.length(); i++) { 11 if (s[i] == '[') { 12 flag = true; 13 continue; 14 } 15 if (s[i] == ']') { 16 flag = false; 17 finish = true; 18 } 19 if (flag) temp += s[i]; 20 if (finish) { 21 res.push_back(temp); 22 finish = false; 23 temp = ""; 24 } 25 } 26 return res; 27 } 28 int main() { 29 string hand, eyes, mouth; 30 getline(cin, hand); 31 getline(cin, eyes); 32 getline(cin, mouth); 33 vector<string> H, E, M; 34 H = choose(hand); 35 E = choose(eyes); 36 M = choose(mouth); 37 int k, lh, le, m, re, rh; 38 cin >> k; 39 for (int i = 0; i < k; i++) { 40 cin >> lh >> le >> m >> re >> rh; 41 if (lh <= H.size() && rh <= H.size() && le <= E.size() && re <= E.size() && m <= M.size() && lh>0 && le>0 && m>0 && re>0 && rh>0) { 42 cout << H[lh - 1] << "(" << E[le - 1] << M[m - 1] << E[re - 1] << ")" << H[rh - 1] << endl; 43 } 44 else { 45 cout << "Are you kidding me? @\\/@" << endl; 46 } 47 } 48 return 0; 49 }
Java实现: