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

微信公众号:计算机黑科学大全
【欢迎关注微信公众号:计算机黑科学大全,对话框回复: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;
}

微信号:aiyoutao76

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值