要考虑的情况有点多,难度在两方面,一个是牌的大小顺序,这里我选择写一个函数返回牌的大小(注意这里的10很烦人,它占了两个字符,但是只有10是以1打头的,所以可以“以一当十”。另外一个难点是判断牌的类型,由于炸弹的优先级最高,按照双王,炸弹优先的顺序来写逻辑,抛开所有炸弹的情况后,再进行牌的类型判断,主要依据是两个字符串的空格数,空格数相同就是一类牌,相同的空格数才能比较。比较的时候比较第一位即可,

#include<string>
using namespace std;
int getValue(char s){
    if(s=='2') return 15;
    if(s=='A') return 14;
    if(s=='K') return 13;
    if(s=='Q') return 12;
    if(s=='J') return 11;
    if(s=='1') return 10;//只有10开头是1,所以用1代替10;
    else 
        return (s-'3'+3);
}
int main(){
    string s;
    while(getline(cin,s)){
        string str1="";
        string str2="";
        int k=0;
        for(int i=0;i<s.size();i++){
            if(s[i]!='-'){
                str1+=s[i];
            } 
            else{
                k=i+1;
                break;
            }
        }
        for(int i=k;i<s.size();i++){
                str2+=s[i];
        }
        int space1=0;//根据空格数量判断牌的类型。
        int space2=0;
        for(int i=0;i<str1.size();i++){
            if(str1[i]==' '){
                space1++;
            }
        }
        for(int j=0;j<str2.size();j++){
            if(str2[j]==' '){
                space2++;
            }
        }
        //出现王的情况单独拎出来。
        if(str1=="joker JOKER"||str2=="joker JOKER"){
            cout<<"joker JOKER";
        }
        //单个的:如果出现一方有大小王。
        else if(str1=="JOKER"||str2=="JOKER"){
            cout<<"JOKER";
        }
        else if(str1=="joker"||str2=="joker"){
            cout<<"joker";
        }
        //出现三个空格说明有炸弹。如果两个都有炸弹
        else if(space1==3&&space2==3){
            getValue(str1[0])<getValue(str2[0])?cout<<str2 : cout<<str1;
        }
        //如果只有一方有炸弹,谁是炸弹输出谁。
        else if(space1==3||space2==3){
            if(space1==3) cout<<str1;
            if(space2==3) cout<<str2;
        }
        //炸弹的特殊情况判断完了 开始判断类型是否一致。
        else if(space1!=space2){
            cout<<"ERROR";
        }
        else{
             getValue(str1[0])<getValue(str2[0])?cout<<str2 : cout<<str1;
        }
      cout<<endl;
    }
}