思路:
- 因为最后要输出字典序最小的解,所以将手势按字典序排序:B,C,J;
- 为了代码简练,将B,C,J对应到数字0,1,2;并用模运算构成循环相克的特性;
- 写一个change函数来将接受到的字母转换为数字;
- 对于接受到的甲乙手势c1,c2,通过change函数将其转换为k1,k2,由于B,C,J的顺序就是循环相克的,所以甲胜的条件就是(k1+1)%3 == k2;
注意点:
- scanf("%c")会读入换行符'\n',所以用一个getchar()来吸收换行符;
- 甲赢的时候同时记乙负,乙赢记甲负;
#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; }