这题一开始没有思路,看了下解析写了一遍,注意点挺多的。
①为了避免过多的if else语句造成繁杂,采用字母转化成数字的方法。这里有一个小的胜平负判断方法需吸收。
②由于scanf使用%c时会将换行符\n读入,需要在相应地方使用getchar吸收空格
③甲乙胜平负次数采用两个数组来记录,同时,甲乙相应的手势胜次也采用两个数组来记录,甲赢乙也要记,乙赢甲也要记,成对出现。
#include<cstdio>
int change(char c){ //B为0,C为1, J为2,恰好是循环相克的顺序,且字典序递增
if(c=='B')return 0;
if(c=='C')return 1;
if(c=='J')return 2;
}
int main(){
int N;
char mp[3]={'B','C','J'};
scanf("%d",&N);
int times_A[3]={0},times_B[3]={0};//分别记录甲、乙胜、平、负次数
//按BCJ顺序分别记录甲乙3种手势的获胜次数
int hand_A[3]={0},hand_B[3]={0};
char c1,c2;
int k1,k2;
for(int i=0;i<N;i++){
getchar();
scanf("%c %c",&c1,&c2);//甲、乙的手势
k1=change(c1);//转化为数字
k2=change(c2);
if((k1+1)%3==k2){//如果甲赢
times_A[0]++;//甲赢次数加一
times_B[2]++;//乙负次数加一
hand_A[k1]++;//甲靠k1赢的次数加一
}else if(k1==k2){//如果平局
times_A[1]++;//甲平次数加一
times_B[1]++;//乙平次数加一
}else{//如果乙赢
times_A[2]++;//甲负次数加一
times_B[0]++;//乙赢次数加一
hand_B[k2]++;//乙靠k2赢的次数加一
}
}
printf("%d %d %d\n",times_A[0],times_A[1],times_A[2]);
printf("%d %d %d\n",times_B[0],times_B[1],times_B[2]);
int id1=0,id2=0;
for(int i=0;i<3;i++){ //找出甲乙获胜最多的手势
if(hand_A[i]>hand_A[id1])id1=i;
if(hand_B[i]>hand_B[id1])id2=i;
}
printf("%c %c\n",mp[id1],mp[id2]); //转变回BCJ
return 0;
}