题目描述
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图3-1所示。
现给出两人的交锋记录,请统计双方的胜、平、负次数,并给出双方分别出什么手势的胜算最大。
输入格式
第一行给出正整数N(≤10'),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第一个学母代表甲方,第二个字母代表乙方,中间有一个空格。
输出格式
第一、二行分别给出甲、乙的胜、平、负次数,数字间以一个空格分隔。第三行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有一个空格。如果解不唯一,则输出按字典序最小的解。
输入样例
10
C JJ 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
思路:
根据题目要求。利用if语句实现。用times_A,times_B数组保存甲、乙的胜、平、负的情况。利用hand_A,hand_B数组保存获胜次数最多的手势。
这里值得一提的是,巧妙的将字母转换为对应的字母,然后进行数字循环进行判断谁胜谁负。避免了大量的if...else判断,使得写法更加简洁。例如,‘B’对应0,‘C’对应1,‘J’对应2,它们正好是循环相克的顺序。利用k1,k2分别保存甲,乙的手势(0、1、2),则当(k1+1)%3==k2时,甲赢。当k1==k2时,平局,当(k2+1)%3==k1时,乙赢。
另外,当输入格式是%c时,换行符\n会被读入,需要在合适的地方用getchar()将空格吸收——程序输入数据后闪退,基本就是这个问题导致。
代码实现
#include<cstdio>
int change(char c)
{
if(c=='B') return 0;//布 对应 0
if(c=='C') return 1;//锤 对应 1
if(c=='J') return 2;//剪 对应 2
}
int main()
{
int N;
char c1,c2;
char mp[3] = {'B','C','J'};
int times_A[3] = {0},times_B[3] = {0};//甲,乙胜、平、负的次数
int hand_A[3] = {0},hand_B[3] = {0}; //按BCJ顺序记录手势的获胜次数
int k1,k2;
scanf("%d",&N);
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]++;
}
else if(k1==k2) //甲乙平
{
times_A[1]++;
times_B[1]++;
}
else //乙胜,甲负
{
times_A[2]++;
times_B[0]++;
hand_B[k2]++;
}
}
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[id2]) id2 = i;
}
for(int i=0;i<3;i++) printf("%d ",times_A[i]);
printf("\n");
for(int i=0;i<3;i++) printf("%d ",times_B[i]);
printf("\n");
printf("%c %c",mp[id1],mp[id2]);
return 0;
}