思路:
- 因为最后要输出字典序最小的解,所以将手势按字典序排序: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;
}

京公网安备 11010502036488号