大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 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
这道题的注意点在注释里了。三种情况(布锤剪刀)用三个数字0,1,2表示是本题要注意的点,可以省下许多不必要的if代码。同时,
int a[3]={0},b[3]={0};//记录甲乙出布、剪刀、锤子赢的数量
也值得记住。在这种记录某种情况出现的次数的情况下,数组有一定优势(出t1(假如为0,B,布)赢的话,就在a[t1]上+1)
#include<iostream>
using namespace std;
int change(char x){
if(x=='B') return 0;
if(x=='C') return 1;
if(x=='J') return 2;
else return -1;
}
char rechange(int x){
if(x==0) return 'B';
if(x==1) return 'C';
if(x==2) return 'J';
else return 'e';
}
int main(){
int n,i;
char x,y;
int t1,t2,max1,max2,f1,f2;
int aWinCnt,bWinCnt,abEqualCnt;
int a[3]={0},b[3]={0};//记录甲乙出布、剪刀、锤子赢的数量
cin>>n;
aWinCnt = 0;
bWinCnt = 0;
abEqualCnt = 0;
max1 = -1;
f1 = -1;
max2 = -1;
f2 = -1;
while(n--){
cin>>x>>y;
t1 = change(x);
t2 = change(y);
if((t1+1)%3==t2){//找规律…这个方法应该可以用在许多地方,有数种情况的时候都可以用。(类似剪刀石头布的)
aWinCnt++;
a[t1]++;
}
else if((t2+1)%3==t1){
bWinCnt++;
b[t2]++;
}
else{
abEqualCnt++;
}
}
cout<<aWinCnt<<" "<<abEqualCnt<<" "<<bWinCnt<<endl;
cout<<bWinCnt<<" "<<abEqualCnt<<" "<<aWinCnt<<endl;
for(i=0;i<3;i++){
if(max1<a[i]){
f1 = i;
max1 = a[i];
}
if(max2<b[i]){
f2 = i;
max2 = b[i];
}
}
//cout<<f1<<" "<<f2<<endl;
cout<<rechange(f1)<<" "<<rechange(f2)<<endl;
}