题目要求:大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第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
解题思路:C代表锤子,J代表剪刀,B代表布,此处为三角恋并两两相克,题目要求按照字典序最小,则可令B为0,C为1,J为2。 此处分析,若甲赢,则甲是0(布),乙是1(锤子);或甲是1(锤子),乙是2(剪刀);或甲是2,乙是0。所以可用(甲+1)%3==乙这个方程式来判断甲赢;当然若将布.锤子和剪刀的值更换成连续的三个正整数,此方程式仍然符合。
参考代码:
#include<stdio.h>
#include <iostream>
using namespace std;
int main()
{
char judge_hand(int a[],int n); //函数声明
void judge_fun(int a[] ,int ,int b[] ,int ,int c[],int );
//函数声明中形参(即括号里的)中int i,i可省略
int cin_2_figure(char a);
char C,D;
int N; //猜拳次数
int a[5] = {0}; // a[0]为甲win,a[1]为平,a[2]为甲输,
//a[3]为乙win, a[4]为乙输
int b[3] = {0}; //b[0]为甲凭借B赢,b[1]为甲凭借C赢,
//b[2]为甲凭借J赢,
int c[3] = {0}; //c[0]为乙凭借B赢,c[1]为乙凭借C赢,
//c[2]为乙凭借J赢,
cin >> N;
for(int k = 0;k < N ;k++)
{
judge_fun(a,5,b,3,c,3); //此处只是为了将数组传入
//judge_fun()函数,5 3 3无作用
}
C = judge_hand(b,3); //C是b数组中最大的数所对应的出法
D = judge_hand(c,3);
cout << a[0] <<" "<< a[1]<< " "<< a[2]<<endl;
cout << a[3] <<" "<< a[1]<< " "<< a[4]<<endl;
cout << C << " " << D;
return 0;
}
char judge_hand(int a[],int n) //判断形参a数组中最大的数所对应的出法
{
int comp = 0; //comp 为赢得次数最多的那个次数
for(int i=0;i<n;i++)
{
if(a[i]>comp)
comp = a[i]; //找出a[]数组中较大的数
}
if(comp == a[0] ) //如果较大的数是a[0],则说明是布赢得的次数最多,此处先辨别a[0],因为如果有赢得次数相等的出法,则按照字典序输出;即此函数只输出B,C,J中第一个与最大值次数相等的出法,如 2 2 5 则一定输出 5对应的出法;如 2 2 1 则一定输出第一个2 对应的出法;如1 1 1 则一定输出第一个1对应的出法。即符合题意!
return 'B';
else if(comp == a[1])
return 'C';
else
return 'J';
}
void judge_fun(int a[],int n,int b[],int m,int c[],int u)
//判断赢得次数,n,m,u为形参输入,以将数组传入函数,此处无作用
{
int cin_2_figure(char a); //函数声明
char cin_A,cin_B;
int q,w;
getchar(); //cin的如果是char类型,会将换行符也一起输入到输入缓存中,所以这时候用getcahr()函数将换行符消除
cin >> cin_A>> cin_B;
q = cin_2_figure(cin_A); //将cin_A转化为数字比较
w = cin_2_figure(cin_B);
if((q+1)%3==w) //甲win
{
a[0]++;
a[4]++;
if(q == 0) //甲赢,并且甲出的是0,即布
b[0]++;
else if(q == 1)
b[1]++;
else
b[2]++;
}
else if(q == w) //平手
a[1]++;
else //乙赢
{
a[3]++;
a[2]++;
if(w == 0) //乙赢,并且乙出的是0即布
c[0]++;
else if(w == 1)
c[1]++;
else
c[2]++;
}
}
int cin_2_figure(char a) //将字符B,C,J转化为数字考虑,较为方便
{
if(a == 'B')
return 0;
else if(a == 'C')
return 1;
else if (a == 'J')
return 2;
}