天天看点

PTA乙级1052,卖个萌

这道题自我感觉较为繁琐,搞了很久,大部分注意点和提示都注释了

#include<bits/stdc++.h>
      using namespace std;
        
      int main(){
            vector<vector<string> >emotion;//存储表情符号的动态二维数组,在string后的>和emotion前的>之间加个空格,否则认为是重载>>
            for(int i=0;i<3;i++){//前三行输入可选符号集,第一行是代表手,第二行是眼,第三行是口
        
                string line;//输入的一行字符串
                getline(cin,line);
        
                vector<string>temp;//存储这一行字符串的表情符号
                for(int j=0;j<line.size();j++){//遍历一遍这一行的字符串
                    if(line[j]=='[')//遇到'['字符
                        for(int k=j+1;k<line.size();k++){//查找']'字符并将'['和']'之间的字符串存储到temp中
                            if(line[k]==']'){
                                temp.push_back(line.substr(j+1,k-j-1));//截取line数组中索引由j+1到k-j-1之间的字符,构成表情
                                break;//退出查找']'的循环,进入下一个表情的查找
                            }
                        }
                }
                //直到现在,每一次输入的一行字符串中所有的表情都已存进temp数组中
                //再将每一个temp,即表情符号存入表情符号集合emotion中,第一行是代表手,第二行是眼,第三行是口
                emotion.push_back(temp);
            }
        
            int N;
            cin>>N;
        
            while(N--){
                int a,b,c,d,e;
                cin>>a>>b>>c>>d>>e;//输入左手、左眼、口、右眼、右手的序号
                
                //emotion[0]是所有“手”的符号集,emotion[1]是所有“眼”的符号集,emotion[2]是所有“口”的符号集
                if(a>emotion[0].size()||b>emotion[1].size()||c>emotion[2].size()||d>emotion[1].size()||e>emotion[0].size()||a<1||b<1||c<1||d<1||e<1)
                    cout<<"Are you kidding me? @\\/@"<<endl;//下标不合法,输出相应字符串
        
                else//否则输出表情,注意输入的值对应的索引要减一
                    cout<<emotion[0][a-1]<<"("<<emotion[1][b-1]<<emotion[2][c-1]<<emotion[1][d-1]<<")"<<emotion[0][e-1]<<endl;
        
            }
            return 0;
        }