whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1052 || 卖个萌(详解,C/C++示例,测试点分析)

Posted on 2019-10-01 In PAT

卖个萌

题目描述

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

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

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

输入格式

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

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

输出格式

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

输入样例

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

输出样例

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

问题解决

解题思想

此题按部就班的处理就行。下方代码采用的是输入的同时直接提取每个符号的字符(也就是方括号内的部分),输出时根据选择符号的序号按顺序输出相应的字符。在输出Are you kidding me? @\/@时注意反斜杠\的输出要再添加一个反斜杠进行转义\\。

坑点提醒

坑点主要是测试点1和2的部分。注意输入的序号可能有小于0的情况(如测试点2),也可能有等于0的情况(如测试点1)。

代码示例(C/C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <cstdio>
using namespace std;
const int maxk = 10000; //最大k
int main()
{
char str[3][11][5]; //第0维是手眼口,第1维是每1类的符号,第2维是每个符号的字符
int len[3]; //分别为手眼口的字符数
for(int i = 0; i < 3; i++){ //字符的提取输入,只提取方括号[]内的部分
int j = 0;
char c = getchar();
while(c != '\n'){
int p = 0;
if(c == '['){
c = getchar();
while(c != ']'){
str[i][j][p++] = c;
c = getchar();
}
str[i][j][p] = '\0'; //若无此句,输出会出错
j++;
}
c = getchar();
}
str[i][j][0] = '\0'; //若无此句,输出会出错
switch(i) //统计手眼口的字符数
{
case 0:
len[i] = j;break;
case 1:
len[i] = j;break;
case 2:
len[i] = j;
}
}
int k,num[maxk][5];
scanf("%d",&k);
for(int i = 0; i < k; i++){ //用户符号选择序列
for(int j = 0; j < 5; j++){
scanf("%d",&num[i][j]);
}
}
for(int i = 0; i < k; i++){
if(num[i][0] <= 0||num[i][1] <= 0||num[i][2] <= 0
||num[i][3] <= 0||num[i][4] <= 0){ //不存在符号序号小于等于0的情况
printf("Are you kidding me? @\\/@\n");
}
else if(num[i][0] <= len[0]&&num[i][1] <= len[1]&&num[i][2] <= len[2]
&&num[i][3] <= len[1]&&num[i][4] <= len[0]){ //不存在符号序号超出相应最大长度的情况
for(int j = 0; j < 5; j++){
if(j == 1){
printf("(");
}
//下面4行是控制以“左手 左眼 口 右眼 右手”顺序输出
int k = j; //j为0 1 2时,k等于j
if(j > 2){ //j为3 4时,k相应为1 0
k = 4 - j;
}
for(int p = 0; str[k][num[i][j] - 1][p] != '\0'; p++){
printf("%c",str[k][num[i][j] - 1][p]);
}
if(j == 3){
printf(")");
}
}
printf("\n");
}
else{
printf("Are you kidding me? @\\/@\n");
}
}
return 0;
}

题目来源:PAT乙级1052
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1051 || 复数乘法(详解,C/C++示例,测试点分析)
PAT乙级1053 || 住房空置率(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 卖个萌
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例
    5. 1.5. 输出样例
    6. 1.6. 问题解决
      1. 1.6.1. 解题思想
      2. 1.6.2. 坑点提醒
      3. 1.6.3. 代码示例(C/C++)
© 2021 Mengzhao Wang