PAT:1018

Posted zongji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT:1018相关的知识,希望对你有一定的参考价值。

1018 锤子剪刀布 (20分)

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

技术图片

 

 

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

输入格式:

输入第 1 行给出正整数 N(10?5??),即双方交锋的次数。随后 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;
}

 

以上是关于PAT:1018的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1018. Public Bike Management

PAT:1018

PAT 1018. 锤子剪刀布

PAT 1018 Public Bike Management (Dijkstra + dfs记录多条最短路径)

DSA 2020 8.1-8.10

微信小程序代码片段