『题目』
萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]
现给出可选用的符号集合,请你按用户的要求输出表情。
输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号[]内。题目保证每个集合都至少有一个符号,并不超过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? @\/@
『思路』
我的思路一向比较直白浅显,把 "[" 和 "]" 变成空格,然后用 sstream 把每个符号存在Vector容器里,然后按照题目读取调用就行.
『代码』(第一次)
#include <bits/stdc++.h>
using namespace std;
//将所有的'['和']'都变成空格
string rep(string s){
int len = s.length();
for(int i = 0; i < len; i++)
if(s[i] == '[' || s[i] == ']')
s[i] = ' ';
return s;
}
int main(){
vector<string> vh,ve,vm;
string hand,eye,mouth,buf;
getline(cin,hand);//输入字符
getline(cin,eye);
getline(cin,mouth);
hand = rep(hand); eye = rep(eye); mouth = rep(mouth);
//将三个字符串分成多个字符数组
stringstream sh(hand);
stringstream se(eye);
stringstream sm(mouth);
vh.push_back("0"); ve.push_back("0"); vm.push_back("0");
while(sh >> buf) vh.push_back(buf);
while(se >> buf) ve.push_back(buf);
while(sm >> buf) vm.push_back(buf);
int hlen = vh.size(),elen = ve.size(),mlen = vm.size();
int k,flag = 0;
cin>>k;
string ans[k+1];
for(int i = 0; i < k; i++){
int a[5];
for(int j =0; j < 5; j++){
cin>>a[j];
}
if(a[0] > hlen - 1 || a[1] > elen - 1 || a[2] > mlen - 1 || a[3] > elen - 1 || a[4] > hlen - 1)//判断是否超出序号范围,超出flag 则为 1
flag = 1;
if(!flag){
ans[i] = vh[a[0]] + "(" + ve[a[1]] + vm[a[2]] + ve[a[3]] + ")" + vh[a[4]];
}
else{
flag = 0;
ans[i] = "Are you kidding me? @\\/@";// '\'应该加一个转义符
}
}
for(int i = 0; i < k; i++)
cout<<ans[i]<<endl;
return 0;
}
第一次OJ只有一个点过了,我开始以为错误是------如果符号中也出现了 '[' 或者 ']' ,则结果一定是错误,所以.我苦思冥想,如何可以判断 '[' ']' 是否在所给字符中,无果.只好重新考虑字符串的读取问题.于是"百度一下,你就知道".发现大佬的AC代码,存在 '[' ']' 在字符中时也是无法判断,所以排除这种可能.接着再回去看题目,发现有个序号从1开始,开始以为输入会控制,但加上这个下界控制以后,又过了一个测试点.
最后经过不懈努力,发现在输入的符号为空的时候,会全部输出"Are you kidding me? @\\/@";
『AC代码』
#include <bits/stdc++.h>
using namespace std;
string rep(string s) {
int len = s.length();
for(int i = 0; i < len; i++)
if(s[i] == '[' || s[i] == ']')
s[i] = ' ';
return s;
}
int cnt(string s) {
int len = s.length(),tot = 0;
for(int i = 0; i < len; i++)
if(s[i] == '[')
tot++;
//cout<<tot<<" ";
return tot;
}
void print(vector<string> v) {
int len = v.size();
for(int i = 0; i < len; i++)
cout<<v[i];
cout<<endl;
}
int main() {
vector<string> vh,ve,vm;
string hand,eye,mouth,buf;
getline(cin,hand);
getline(cin,eye);
getline(cin,mouth);
int th = cnt(hand), te = cnt(eye), tm = cnt(mouth);
hand = rep(hand);
eye = rep(eye);
mouth = rep(mouth);
stringstream sh(hand);
stringstream se(eye);
stringstream sm(mouth);
vh.push_back("0");
ve.push_back("0");
vm.push_back("0");
while(sh >> buf) vh.push_back(buf);
while(se >> buf) ve.push_back(buf);
while(sm >> buf) vm.push_back(buf);
int hlen = vh.size(),elen = ve.size(),mlen = vm.size();
/*print(vh);
print(ve);
print(vm);*/
int k;
cin>>k;
string ans[k+1];
for(int i = 0; i < k; i++) {
int a[5];
for(int j =0; j < 5; j++) {
cin>>a[j];
}
if(a[0] > th|| a[1] > te || a[2] > tm || a[3] >te || a[4] > th)
ans[i] = "Are you kidding me? @\\/@";
else if(a[0] <= 0 || a[1] <= 0 || a[2] <= 0 || a[3] <= 0 || a[4] <= 0)
ans[i] = "Are you kidding me? @\\/@";
else{
if(hlen != 1)
ans[i] = vh[a[0]] ;
if(elen != 1)
ans[i] = ans[i]+ "(" + ve[a[1]];
if(mlen != 1)
ans[i] = ans[i]+ vm[a[2]];
if(elen != 1)
ans[i]=ans[i]+ ve[a[3]] + ")";
if(hlen != 1)
ans[i] = ans[i] + vh[a[4]];
}
}
for(int i = 0; i < k; i++)
cout<<ans[i]<<endl;
return 0;
}
『感悟』
我要去睡觉了,这题一点也不萌,代码写的有一些长,题目有一些漏洞,PAT就是在一些小地方给你挖坑,但是题目存在一些漏洞。
还有输出尽量分开写