【PAT】(B)1052 卖个萌 (20)

『题目』


萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:

[左手]([左眼][口][右眼])[右手]

现给出可选用的符号集合,请你按用户的要求输出表情。

输入格式:

输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号[]内。题目保证每个集合都至少有一个符号,并不超过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就是在一些小地方给你挖坑,但是题目存在一些漏洞。

还有输出尽量分开写

猜你喜欢

转载自blog.csdn.net/sinat_40872274/article/details/81290973
今日推荐