【练习】PAT 乙 1052 卖个萌

题目

萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手] ([左眼][口][右眼]) [右手] 现给出可选用的符号集合,请你按用户的要求输出表情。

输入格式

输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号[]内。题目保证每个集合都至少有一个符号,并不超过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 卖个萌


思路(注意事项)

需要注意一个点:用户选择的序号可能为正可能为负


纯代码

#include
using namespace std;
vector<vector<string>> v;
vector<string> hand, eye, mouth;
vector<string> func(){
	string t,s;
    vector<string> ans;
    stack<char> st;
	getline(cin, s);
	for (int i = 0; i < s.size(); i ++)
		if (s[i] != '[' && s[i] != ']' && s[i] != ' ') st.push(s[i]);
        else if (s[i] == ']') {
            while (!st.empty()){
                t += st.top();
                st.pop();
            }
            reverse(t.begin(), t.end());
            ans.push_back(t);
            t = "";
        }
	return ans;
}
int main(){
	hand = func(), v.push_back(hand);
	eye = func(), v.push_back(eye);
	mouth = func(), v.push_back(mouth);
	int n, hs = hand.size(), es = eye.size(), ms = mouth.size();
    int a[5] = {hs, es, ms, es, hs}, b[5] = {0,1,2,1,0};
	cin >> n;
	while (n --){
		int tmp[5], flag = 1;
        for (int i = 0; i < 5; i ++){
            cin >> tmp[i];
            if (tmp[i] > a[i] || tmp[i] < 1){
                cout << "Are you kidding me? @\\/@" << endl;
                flag = 0;
                break;
            }
        }
        if (flag == 0) continue;
        for (int i = 0; i < 5; i ++){
            if (i == 1) cout << '(';
            else if (i == 4) cout << ')';
            cout << v[b[i]][tmp[i] - 1];
        }
		cout << endl;
	}
    return 0; 
}

题解(加注释)

#include
using namespace std;

vector<vector<string>> v;  // 存储手、眼、嘴的符号
vector<string> hand, eye, mouth;

// 处理输入字符串,提取 [] 中的内容
vector<string> func() {
    string t, s;
    vector<string> ans;  // 存储提取的结果
    stack<char> st;      // 用于临时存储字符
    getline(cin, s);     // 读取整行输入

    for (int i = 0; i < s.size(); i++) {
        if (s[i] != '[' && s[i] != ']' && s[i] != ' ') {
            st.push(s[i]);  // 将非括号和空格的字符压入栈中
        } else if (s[i] == ']') {
            // 当遇到 ']' 时,将栈中的字符弹出并拼接成字符串
            while (!st.empty()) {
                t += st.top();
                st.pop();
            }
            reverse(t.begin(), t.end());  // 反转字符串,恢复原始顺序
            ans.push_back(t);  // 将提取的字符串加入结果
            t = "";  // 清空临时字符串
        }
    }
    return ans;  // 返回提取的结果
}

int main() {
    // 处理输入的手、眼、嘴的符号
    hand = func();
    v.push_back(hand);  // 将手部符号加入向量
    eye = func();
    v.push_back(eye);   // 将眼部符号加入向量
    mouth = func();
    v.push_back(mouth); // 将嘴部符号加入向量

    int n, hs = hand.size(), es = eye.size(), ms = mouth.size();
    int a[5] = {hs, es, ms, es, hs};  // 各部分的符号数量
    int b[5] = {0, 1, 2, 1, 0};       // 各部分在向量中的索引

    cin >> n;  // 输入表情组合的数量
    while (n--) {
        int tmp[5], flag = 1;  // tmp存储输入的索引,flag标记是否合法

        // 输入5个索引并检查合法性
        for (int i = 0; i < 5; i++) {
            cin >> tmp[i];
            if (tmp[i] > a[i] || tmp[i] < 1) {  // 检查索引是否超出范围
                cout << "Are you kidding me? @\\/@" << endl;
                flag = 0;  // 标记为不合法
                break;
            }
        }

        if (flag == 0) continue;  // 如果索引不合法,跳过后续操作

        // 输出表情组合
        for (int i = 0; i < 5; i++) {
            if (i == 1) cout << '(';  // 在第二个部分前输出 '('
            else if (i == 4) cout << ')';  // 在第五个部分前输出 ')'
            cout << v[b[i]][tmp[i] - 1];  // 输出对应符号
        }
        cout << endl;
    }

    return 0;
}

你可能感兴趣的:(输入输出,PAT,题解,算法,c++)