萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]现给出可选用的符号集合,请你按用户的要求输出表情。
输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号[]内。题目保证每个集合都至少有一个符号,并不超过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 - 10 之间,且不超过对应表情的数目(测试点2,3) 用三维字符数组也可以,不必要结构体。 #include<stdio.h> #include<string.h> typedef struct{ char s[5]; }E; E emotion[5][20]; int main() { char a[10005]; int flag=0,k=0; int num[5]; memset(num,0,5*sizeof(int)); for(int i=1;i<=3;i++) { gets(a); int length=strlen(a); for(int j=0;j<length;j++) { if(a[j]==']') { emotion[i][num[i]].s[k]='\0'; k=0; flag=0; } if(flag==1) emotion[i][num[i]].s[k++]=a[j]; if(a[j]=='[') { flag=1; num[i]++; } } } int N; int p[10]; scanf("%d",&N); for(int i=1;i<=N;i++) { for(int j=1;j<=5;j++) scanf("%d",&p[j]); if(p[1]<=num[1]&&p[1]>0&&p[1]<=10&&p[2]<=num[2]&&p[2]>0&&p[2]<=10&&p[3]<=num[1]&&p[3]>0&&p[3]<=10&&p[4]<=num[2]&&p[4]>0&&p[4]<=10&&p[5]<=num[1]&&p[5]>0&&p[5]<=10) printf("%s(%s%s%s)%s\n",emotion[1][p[1]].s,emotion[2][p[2]].s,emotion[3][p[3]].s,emotion[2][p[4]].s,emotion[1][p[5]].s); else { printf("Are you kidding me? @\\/@\n"); } } } 另外贴一段将数据录入的代码,从别处借鉴的: char c; int flag=0,k=0; int num[5]; char emotion[5][20][5]={0}; memset(num,0,5*sizeof(int)); for(int i=1;i<=3;i++) for(int j=1;(c=getchar())!='\n';) { if(c=='[') { scanf("%[^]]",emotion[i][j++]); num[i]++; } } 原理: scanf的正则表达式之一。 一般我们是scanf("%s", xxxx),有时我们希望空格也输入进去,可以用scanf("%[^\n]", xxxx) %[^\n]的意思就是以'\n'作为输入的结束标志。 同理%[^,]就是以','做输入的结束标志。 其它的如 %[a-z] 表示匹配a到z中任意字符 %[aB'] 匹配a、B、'中一员 fscanf的用法基本一样。