【欢迎关注微信公众号:计算机黑科学大全,对话框回复:PAT乙级真题】获取全部真题详解及代码示例 个人博客地址:https://mzwang.top
萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]现给出可选用的符号集合,请你按用户的要求输出表情。
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []内。题目保证每个集合都至少有一个符号,并不超过 10 个符号;每个符号包含 1 到 4 个非空字符。
之后一行给出一个正整数 K,为用户请求的个数。随后 K 行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从 1 开始),数字间以空格分隔。
对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出 Are you kidding me? @\/@。
题目来源:PAT乙级1052 作者:CHEN, Yue 单位:浙江大学
此题按部就班的处理就行。下方代码采用的是输入的同时直接提取每个符号的字符(也就是方括号内的部分),输出时根据选择符号的序号按顺序输出相应的字符。在输出Are you kidding me? @\/@时注意反斜杠\的输出要再添加一个反斜杠进行转义\\。
坑点主要是测试点1和2的部分。注意输入的序号可能有小于0的情况(如测试点2),也可能有等于0的情况(如测试点1)。
小提示:请将以下代码保存为.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; }