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实现:

 

posted @ 2021-04-15 12:55  47的菠萝~  阅读(65)  评论(0编辑  收藏  举报