1018 锤子剪刀布 (20)(20 分)解析

本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344

1018 锤子剪刀布 (20)(20 分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第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,J,B的赢的次数和胜利,平的次数,再设计3个函数,一个函数判定哪方胜利,一个函数判定胜利方的手势,还有一个函数统计胜利一方的胜利次数和手势次数。

代码:

#include<iostream>
using namespace std;
void AlterCh(char c,char &ch)//判定哪个手势赢 
{
	if(c=='C')
	ch='C';
	else if(c=='J')
	ch='J';
	else
	ch='B';
}
int Judge(char ch1,char ch2,char &ch)//判定赢的一家及赢的手势 
{
	if(ch1==ch2)
	return 0;//若平则返回0
	if(ch1=='C'&&ch2=='J'||ch1=='J'&&ch2=='B'||ch1=='B'&&ch2=='C')
	{//若甲赢则记录手势并返回1 
		AlterCh(ch1,ch);
		return 1;
	}
	AlterCh(ch2,ch);
	return -1;//若乙赢则记录手势并返回-1
}
void Handle(int *a,char ch)//统计胜利及手势赢的次数 
{
	a[3]++;
	if(ch=='C')
	a[0]++;
	else if(ch=='J')
	a[1]++;
	else 
	a[2]++;
}
char Compare(int cntC,int cntJ,int cntB)//比较各赢的手势次数 
{
	if(cntB>=cntJ&&cntB>=cntC)
	return 'B';
	else if(cntC>cntB&&cntC>=cntJ)
	return 'C';
	else
	return 'J';
}
int main()
{//a[i]:i=0-2:C,J,B赢的次数, i=3,4:胜,平的次数 
	int N,A[5]={0},B[5]={0};
	char ch1,ch2,ch;
	cin>>N;
	while(N--)
	{
		cin>>ch1>>ch2;
		if(Judge(ch1,ch2,ch)==1)
		Handle(A,ch);
		else if(Judge(ch1,ch2,ch)==-1)
		Handle(B,ch);
		else 
		{//统计平的次数 
			A[4]++;
			B[4]++;
		}
	}
	cout<<A[3]<<' '<<A[4]<<' '<<B[3]<<endl;
	cout<<B[3]<<' '<<B[4]<<' '<<A[3]<<endl;
	cout<<Compare(A[0],A[1],A[2])<<' '<<Compare(B[0],B[1],B[2]);
	return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页