大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第1行给出正整数N(<=10^5^),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。
输出格式:
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
C++:
#include<cstdio>
int change(char a){
if(a=='B') return 0; //总是前一个胜后一个 并且为字典序
else if(a=='C') return 1; //单个字符用单引号!!!!
else if(a=='J') return 2;
}
int main(){
int n;
char A,B;
int a,b;
int Awin=0; //看来对于定义变量并赋值这种写法不可以连续定义
int Aloss=0; int eq=0; //甲乙平局次数一样
int Bwin=0; int Bloss=0;
int AwinBy[3]={0}; //0\1\2分别表示通过剪刀石头布赢得次数
int BwinBy[3]={0};
char aa,bb;
char turn[3]={'B','C','J'};
scanf("%d",&n);
for(int i=0;i<n;i++){
getchar();
scanf("%c %c",&A,&B); //代表甲乙的手势
a = change(A);
b = change(B);
if(a==b) {
eq++;
}
else if((a+1)%3==b) { //说明a在b的前面 即甲胜
Awin++;
Bloss++;
AwinBy[a]++;
}
else {
Bwin++;
Aloss++;
BwinBy[b]++;
}
}
int idA=0 ;int idB=0;
for(int i=0;i<3;i++){
if(AwinBy[i]>AwinBy[idA]) //因为相等的时候并没有更换
//所以idA或者idB如果和它后面的一个数字是相等的 他们是比他小一的 也就是字典序在前面的
idA=i;
if(BwinBy[i]>BwinBy[idB])
idB=i;
}
aa=turn[idA];
bb=turn[idB]; //得到依靠赢得最多的那个自转换后的数字 再次转换成字母
printf("%d %d %d\n",Awin,eq,Aloss);
printf("%d %d %d\n",Bwin,eq,Bloss);
printf("%c %c\n",aa,bb);
return 0;
}