zoukankan      html  css  js  c++  java
  • PAT:1018

    1018 锤子剪刀布 (20分)

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

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

    输入格式:

    输入第 1 行给出正整数 N(105​​),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

    输出格式:

    输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

    这题很讨厌,看着简单,但是要判断很多种情况,这次在写的时候虽然小心了点,但是没有边写边调试各个功能,导致之后多调半个小时,差点以为这题要流掉了

    代码部分都给出了注释,因为能力不够,代码长了点,见谅

    //甲方命名theone,乙方命名:theshy
    #include<iostream>
    #include<string>
    #include<vector>
    #include<algorithm>
    using namespace std;
    //C:锤子 B:布 J:剪刀
    bool compare(char a,char b[])
    {
    	for (int i = 0; i < 3; i++)
    	{
    		if (a == b[i])
    		{
    			return true;
    		}
    	}
    	return false;
    }
    //求取赢取最多次数的手势所用
    int max_three(int C, int B, int J)//fun=0,返回C。fun=1,返回B。fun=2,返回J。
    {
    	if (C > B&&C>J||C==J&&C>B)
    	{
    		return 0;
    	}
    	else if (B > C&& B > J||B==C&&B>J||B==J&&B>C)
    	{
    		return 1;
    	}
    	else if (J > C&& J > B)
    	{
    		return 2;
    	}
    }
    //当甲方出拳头的情况进行判断
    void judge_C(char b, int& win_o, int& win_s, int& lose_o, int& lose_s, int& equal_o, int& equal_s,int& count_o_C,int& count_s_B)
    {
    	if (b == 'C')
    	{
    		equal_o++;
    		equal_s++;
    	}
    	else if ( b == 'B')
    	{
    		lose_o++;
    		win_s++;
    		count_s_B++;
    	}
    	else if (b == 'J')
    	{
    		win_o++;
    		lose_s++;
    		count_o_C++;
    	}
    }
    //当甲方出布的情况
    void judge_B( char b, int& win_o, int& win_s, int& lose_o, int& lose_s, int& equal_o, int& equal_s,int& count_o_B,int& count_s_J)
    {
    	if (b == 'B')
    	{
    		equal_o++;
    		equal_s++;
    	}
    	else if (b == 'C')
    	{
    		win_o++;
    		lose_s++;
    		count_o_B++;
    	}
    	else if (b == 'J')
    	{
    		lose_o++;
    		win_s++;
    		count_s_J++;
    	}
    }
    //当甲方出剪刀的情况
    void judge_J( char b, int& win_o, int& win_s, int& lose_o, int& lose_s, int& equal_o, int& equal_s,int& count_o_J,int& count_s_C)
    {
    	if (b == 'J')
    	{
    		equal_o++;
    		equal_s++;
    	}
    	else if (b == 'B')
    	{
    		win_o++;
    		lose_s++;
    		count_o_J++;
    	}
    	else if (b == 'C')
    	{
    		lose_o++;
    		win_s++;
    		count_s_C++;
    	}
    }
    
    //获取theone所赢最多的手势
    void get_gesture_o(int a,int b,int c,char &gesture_o)//a ,b,c分别代表C,B,J各手势所赢的次数,gesture_o保存所赢手势
    {
    	if (max_three(a, b, c) == 0) //1表示C:锤子, 0表示B:布, 2表示J:剪刀
    	{
    		gesture_o = 'C';
    	}
    	else if (max_three(a, b, c) == 1)
    	{
    		gesture_o = 'B';
    	}
    	else if (max_three(a, b, c) == 2)
    	{
    		gesture_o = 'J';
    	}
    		
    }
    //获取theshy所赢最多的手势
    void get_gesture_s(int a, int b, int c, char& gesture_s)//a ,b,c分别代表C,B,J各手势所赢的次数,gesture_o保存所赢手势
    {
    	if (max_three(a, b, c) == 0) //0表示C:锤子, 1表示B:布, 2表示J:剪刀
    	{
    		gesture_s = 'C';
    	}
    	else if (max_three(a, b, c) == 1)
    	{
    		gesture_s = 'B';
    	}
    	else if (max_three(a, b, c) == 2)
    	{
    		gesture_s = 'J';
    	}
    
    }
    int judger(vector<char> &one,vector<char> &shy,  int& win_o, int& win_s, int& lose_o, int& lose_s, int& equal_o, int& equal_s ,char &gesture_o,char &gesture_s,char data[])
    {
    	int count_o_C = 0, count_o_B = 0, count_o_J = 0;
    	int count_s_C = 0, count_s_B = 0, count_s_J = 0;
    	for (int i = 0; i < one.size(); i++)
    	{
    		//判断是否是所要求C,B,J其中一个
    		if (!compare(one[i], data) || !compare(shy[i], data))
    		{
    			return -1;
    		}
    		//获取赢,平,输的次数
    		else
    		{
    			if (one[i] == 'C')
    			{
    				judge_C(shy[i],win_o,win_s,lose_o,lose_s,equal_o,equal_s,count_o_C,count_s_B);
    			
    			}
    			else if (one[i] == 'B')
    			{
    				judge_B(shy[i], win_o, win_s, lose_o, lose_s, equal_o, equal_s,count_o_B,count_s_J);
    			
    			}
    			else if(one[i]=='J')
    			{
    				judge_J(shy[i], win_o, win_s, lose_o, lose_s, equal_o, equal_s,count_o_J,count_s_C);
    			
    			}
    		}
    	}
    	//获取手势
    	get_gesture_o(count_o_C, count_o_B, count_o_J, gesture_o);
    	get_gesture_s(count_s_C, count_s_B, count_s_J, gesture_s);
    	/*cout << "count_o_C:" << count_o_C << " " << "count_o_B:" << count_o_B << " " << "count_o_J:" << count_o_J << endl;
    	cout << "count_s_C:" << count_s_C << " " << "count_s_B:" << count_s_B << " " << "count_s_J:" << count_s_J << endl;*/
    	return 0;
    }
    int main()
    {
    	vector<char> theone, theshy;//甲方,乙方
    	char a = 0, b = 0;//用作对vector容器的输入中介,vector容器用下标表示的时候不能进行输入操作,这是在标准库中定义,如果你技术够可以自己写一个重载函数
    	int N = 0;//比较次数
    	cin >> N;
    	int win_o = 0, win_s = 0, lose_o = 0, lose_s = 0, equal_o = 0, equal_s = 0;//甲方所赢次数,甲方所输次数,甲方平局次数,乙方所赢次数,乙方所输次数,乙方平局次数
    	char gesture_o = 0, gesture_s = 0;//甲方赢得最多的手势,乙方...
    	char data[3] = { 'B','J','C' };//判断输入是否满足题意所用
    	//输入
    	for (int i = 0; i < N; i++)
    	{
    		cin >> a >> b;
    		theone.push_back(a);
    		theshy.push_back(b);
    	}
    	int result = 0;
    	//函数调用
    	result = judger(theone, theshy, win_o, win_s, lose_o, lose_s, equal_o, equal_s, gesture_o, gesture_s, data);//判断输入是否是C,B,J之中
    //判断返回值
    	if (!result)//观察函数的返回值,返回值为0的时候表示函数正确调用
    	{
    		//输出
    		cout << win_o << " " << equal_o << " " << lose_o << endl;
    		cout << win_s << " " << equal_s << " " << lose_s << endl;
    		cout << gesture_o << " " << gesture_s;
    	}
    	else
    	{
    		return 0;
    	}
    	return 0;
    }
    
  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/zongji/p/12243730.html
Copyright © 2011-2022 走看看