题目描述
大家应该都会玩“锤子剪刀布”的游戏:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入描述
输入第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
我的代码
#include<stdio.h>
int main(){
char a[100001],b[100001],c[3]={'B','C','J'};;
int n,i,j,win1[3]={0},win2[3]={0},lose1,lose2,same1,same2,max1,max2,t1=0,t2=0;
lose1=lose2=same1=same2=0;
scanf("%d",&n);
for(i=0;i<n;i++){
getchar(); //注意要有getchar
scanf("%c %c",&a[i],&b[i]);
}
for(i=0;i<n;i++){
if(a[i]=='B'){ //当甲出布时
if(b[i]=='B'){ //当乙出布
same1++; //甲的平的次数加1
}
if(b[i]=='C'){ //当乙出锤子
win1[0]++; //甲出布的胜的次数加1
}
if(b[i]=='J'){ //当乙出剪刀
lose1++; //甲的输的次数加1
}
}
if(a[i]=='C'){
if(b[i]=='B'){
lose1++;
}
if(b[i]=='C'){
same1++;
}
if(b[i]=='J'){
win1[1]++;
}
}
if(a[i]=='J'){
if(b[i]=='B'){
win1[2]++;
}
if(b[i]=='C'){
lose1++;
}
if(b[i]=='J'){
same1++;
}
}
}
for(i=0;i<n;i++){
if(b[i]=='B'){
if(a[i]=='B'){
same2++;
}
if(a[i]=='C'){
win2[0]++;
}
if(a[i]=='J'){
lose2++;
}
}
if(b[i]=='C'){
if(a[i]=='B'){
lose2++;
}
if(a[i]=='C'){
same2++;
}
if(a[i]=='J'){
win2[1]++;
}
}
if(b[i]=='J'){
if(a[i]=='B'){
win2[2]++;
}
if(a[i]=='C'){
lose2++;
}
if(a[i]=='J'){
same2++;
}
}
}
max1=win1[0]; //开始统计甲乙哪个手势获胜的次数最多
max2=win2[0];
for(i=0;i<3;i++){
if(win1[i]>max1){
max1=win1[i];
t1=i;
}
if(win2[i]>max2){
max2=win2[i];
t2=i;
}
}
printf("%d %d %d\n",win1[0]+win1[1]+win1[2],same1,lose1);
printf("%d %d %d\n",win2[0]+win2[1]+win2[2],same2,lose2);
printf("%c %c",c[t1],c[t2]);
return 0;
}
我的分析
这道题在输入的时候把我摆了一道,一开始总是没办法输入正确的字符,后来发现是少了getchar。这道题的思路比较好想到,就是分不同种情况来计算甲与乙的胜,平,负。我在这里是对胜的次数的统计用了一个数组,方便之后统计使用什么手势获胜的次数多。
网友评论