思路:

  1. 因为最后要输出字典序最小的解,所以将手势按字典序排序:B,C,J;
  2. 为了代码简练,将B,C,J对应到数字0,1,2;并用模运算构成循环相克的特性;
  3. 写一个change函数来将接受到的字母转换为数字;
  4. 对于接受到的甲乙手势c1,c2,通过change函数将其转换为k1,k2,由于B,C,J的顺序就是循环相克的,所以甲胜的条件就是(k1+1)%3 == k2;

注意点:

  1. scanf("%c")会读入换行符'\n',所以用一个getchar()来吸收换行符;
  2. 甲赢的时候同时记乙负,乙赢记甲负;
#include<cstdio>

int change(char c){
    if(c == 'B') return 0;
    if(c == 'C') return 1;
    if(c == 'J') return 2;
}

int main(){

    char mp[3] = {'B','C','J'};        //用于最后将数字换成符号 

    int n;

    scanf("%d",&n);

    int time_A[3]={0},time_B[3]={0};//记录甲乙的胜平负次数 

    int hand_A[3]={0},hand_B[3]={0};//分别记录甲乙的B,C,J赢得次数

    int k1,k2;

    char c1,c2;

    for(int i=0;i<n;i++){
        getchar();    //因为scanf("%c")会把换行符“\n”读入,所以用getchar把换行符吸收 
        scanf("%c %c",&c1,&c2);
        k1 = change(c1);
        k2 = change(c2);

        if((k1+1)%3 == k2){        //甲赢 
            time_A[0]++;
            time_B[2]++;
            hand_A[k1]++;
        }else if(k1 == k2){        //平局
            time_A[1]++;
            time_B[1]++; 
        }else{                    //乙赢
            time_A[2]++;
            time_B[0]++;
            hand_B[k2]++; 
    }
    }

    printf("%d %d %d\n",time_A[0],time_A[1],time_A[2]);
    printf("%d %d %d\n",time_B[0],time_B[1],time_B[2]);

    int m1 = 0,m2 = 0;
    for(int i=1;i<3;i++){
        if(hand_A[i]>hand_A[m1]) m1 = i;
    }
    for(int i=1;i<3;i++){
        if(hand_B[i]>hand_B[m2]) m2 = i;
    }

    printf("%c %c",mp[m1],mp[m2]); 





    return 0;
}