【PAT乙级1018】——锤子剪刀布

思路:
这个题中,要记录的结果比较多,既要记录两个人的胜负平,又要记录每局赢的那个人使用什么赢的,本来想的是在judge函数把这两个结果都保存下来,发现太麻烦。
后来想到在judge函数中记录每局两个人的胜负平,而用函数返回值来返回赢的人标号,再在主函数里记录每局赢的那个人使用什么赢的;
【补漏】:二维数组作为函数参数怎么传递问题,形参可以有一下两种写法:
void Fun(int a[][len])
void Fun(int (*b)[len])
没有特殊情况,len一般都是去二维数组的宽,调用只需把数组首地址(即数组名)传入即可;

代码如下,提交使用g++

#include<bits/stdc++.h>
using namespace std;

int judge(int rc[][3], char a, char b)
{
	if(a==b)		//平手
	{
		rc[0][1]++;
		rc[1][1]++;
		return 0;
	}
	else
	{
		if((a=='C'&&b=='J')||(a=='J'&&b=='B')
			||(a=='B'&&b=='C'))		//a赢
		{
			rc[0][0]++;
			rc[1][2]++;
			return 1;
		}			
		else						//b赢
		{
			rc[0][2]++;
			rc[1][0]++;
			return 2;
		}
	}
}

int main()
{
	int n, record[2][3], best[2][3];
	//record[2][3]表示甲乙各自胜平负数
	//best[2][3]表示甲乙各自用什么赢的统计变量
	char p1, p2;
	
	cin >> n;
	memset(record, 0, sizeof(record));
	memset(best, 0, sizeof(best));
	while(n)
	{
		int result;
		cin >> p1 >> p2;
		result = judge(record, p1, p2);
		if(result==1)
		{
			switch(p1)
			{
				case 'C':	best[0][1]++;break;
				case 'J':	best[0][2]++;break;
				case 'B':	best[0][0]++;break;
			}
		}
		else if(result==2)
		{
			switch(p2)
			{
				case 'C':	best[1][1]++;break;
				case 'J':	best[1][2]++;break;
				case 'B':	best[1][0]++;break;
			}
		}
		n--;
	}
	int max[2] = {0, 0};
	int pB[2] = {0, 0};
	char dis[3] = {'B', 'C', 'J'};
	for(int i=0; i<2; i++)
	{
		for(int j=0; j<3; j++)
		{
			if(j==0)			
				printf("%d", record[i][j]);			
			else
				printf(" %d", record[i][j]);
			if(max[i] < best[i][j])
			{
				max[i] = best[i][j];
				pB[i] = j;	
			} 
		}		
		printf("\n");
	}	
	printf("%c %c", dis[pB[0]], dis[pB[1]]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值