思路:
这个题中,要记录的结果比较多,既要记录两个人的胜负平,又要记录每局赢的那个人使用什么赢的,本来想的是在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;
}