【欢迎关注微信公众号:计算机黑科学大全,对话框回复:PAT乙级真题】获取全部真题详解及代码示例
个人博客地址:https://mzwang.top
卖个萌
题目描述:
萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]
现给出可选用的符号集合,请你按用户的要求输出表情。
输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号
[]
内。题目保证每个集合都至少有一个符号,并不超过 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? @\/@
题目来源:PAT乙级1052
作者:CHEN, Yue
单位:浙江大学
问题解决:
解题思想
此题按部就班的处理就行。下方代码采用的是输入的同时直接提取每个符号的字符(也就是方括号内的部分),输出时根据选择符号的序号按顺序输出相应的字符。在输出Are you kidding me? @\/@
时注意反斜杠\
的输出要再添加一个反斜杠进行转义\\
。
坑点提醒
坑点主要是测试点1和2的部分。注意输入的序号可能有小于0的情况(如测试点2),也可能有等于0的情况(如测试点1)。
代码示例(C/C++)
小提示:请将以下代码保存为.cpp
格式(C++程序)左右滑动代码以查看完整代码(复制本文链接到电脑端浏览效果更佳)
#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;
}