pat 乙级 1018 锤子剪刀布(C++)

题目

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

输入格式:

输入第 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

分析

  • 求解双方胜、负、平次数,只需每次输入数据时进行判断然后累加即可,注意一人胜另一人负。
  • 求解双方胜利次数最多的手势,且如果解不唯一,选择字母序小的。可用数组下标来顺序对应B、C、J来解决。
  • 可使用一个结构体来存储,成员包括victory,draw,defeat,count[3]。声明两个结构体变量时,声明为全局变量。这样编译器会将变量初始化,不用再自己另外再初始化。

AC代码

#include<iostream>
using namespace std;
struct node
{
    int count[3];
    int victory,draw,defeat;
}A,B;
int game(char A,char B)
{
    if(A==B)
        return 0;
    else if((A=='C'&&B=='J')||(A=='B'&&B=='C')||(A=='J'&&B=='B'))
        return 1;
    else
        return 2;
}

int main()
{
    int i,N;
    char ch1,ch2; 
    cin>>N;
    for(i=0;i<N;i++)
    {
        cin>>ch1>>ch2;
        int temp=game(ch1,ch2);
        if(temp==0)
        {
        	A.draw++;
        	B.draw++;
		}
		else if(temp==1)
		{
			A.victory++;
			B.defeat++; 
			if(ch1=='B')
				A.count[0]++;	
			else if(ch1=='C')
				A.count[1]++;
			else
				A.count[2]++;
		}
		else
		{
			B.victory++;
			A.defeat++;
			if(ch2=='B')
				B.count[0]++;	
			else if(ch2=='C')
				B.count[1]++;
			else
				B.count[2]++;
		}
        	
    }
    
    cout<<A.victory<<" "<<A.draw<<" "<<A.defeat<<endl;
	cout<<B.victory<<" "<<B.draw<<" "<<B.defeat<<endl;
    int max_A=A.count[0],max_B=B.count[0],flag1=0,flag2=0;
    for(i=1;i<3;i++)
    {
    	if(A.count[i]>max_A)
    	{
    		max_A=A.count[i];
    		flag1=i; 
		}
		
		if(B.count[i]>max_B)
    	{
    		max_B=B.count[i];
    		flag2=i; 
		}		
	}
    if(flag1==0) 
		cout<<"B ";
	else if(flag1==1)
		cout<<"C ";
	else
		cout<<"J ";
    if(flag2==0) 
        cout<<"B";
    else if(flag2==1)
        cout<<"C";
    else
        cout<<"J";
	return 0;
}

如果小伙伴有任何问题或者建议,欢迎评论区留言或者私信博主哦

更多题解
pat 乙级 题解汇总(持续更新)(C++)

上一篇:信息学奥赛一本通(1018:其他数据类型存储空间大小)


下一篇:C++版浙大PAT乙级1018(20分)