分析:
步骤一:考虑到最后需要输出字母序的解,可将三种手势先将字母序排序,即 B B B(布), C C C(锤), J J J(剪)。可以发现这个顺序又是环环相克的。即 B B B 胜 C C C, C C C 胜 J J J, J J J 胜 B B B,不妨将 B B B, C C C, J J J 转换为 0 , 1 , 2 0,1,2 0,1,2。
步骤二:对每组读入的甲乙手势 c 1 , c 2 c1,c2 c1,c2,先转换为数字 k 1 , k 2 k1,k2 k1,k2,然后判断该局输赢。由于设置的顺序恰好就是环环相克的顺序,因此 k 1 k1 k1 胜 k 2 k2 k2 的条件是 ( k 1 + 1 ) (k1 + 1) % 3 = k2 (k1+1), k 1 k1 k1 平 k 2 k2 k2 的条件是 k 1 = k 2 k1 = k2 k1=k2, k 1 k1 k1 输 k 2 k2 k2 的条件是 ( k 2 + 1 ) (k2 + 1) % 3 = k1 (k2+1)。
在得到该局的输赢后,对甲乙的胜、平、负情况进行更新,并对赢得该局的一方的手势次数进行更新。
步骤三:比较得到胜利次数最多的手势,将 0 , 1 , 2 0,1,2 0,1,2 转换为 B , C , J B,C,J B,C,J 输出。
本题需要开两组数组,一组(timesa[],timesb[])记录甲乙的胜、平、负的情况,并且要记得甲赢一次,即乙要输一次。另一组(hansa[],handsb[])记录甲乙用布、剪、锤赢的次数。
最后输出的时候要枚举一下 timesa 和 timesb 的情况。从handsa,handsb中找出最大值,转换为相应字符。
代码(C++)
#include <iostream>
using namespace std;
// timesa和timesb的0, 1, 2 分别是甲乙胜,平,负的次数
// handsa和handsb的0,1,2分别是甲乙用步,锤,剪胜的次数
int timesa[3], timesb[3];
int handsa[3], handsb[3];
int change(char c) // 将招数转换为数字
{
if (c == 'B') return 0;
if (c == 'C') return 1;
if (c == 'J') return 2;
}
char dechange(int c) // 输出赢得最多的招数时要按字符输出因此再转换回去
{
if (c == 0) return 'B';
if (c == 1) return 'C';
if (c == 2) return 'J';
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++)
{
char ca, cb; // 甲乙出的“招数”
cin >> ca >> cb;
int ka, kb;
ka = change(ca);
kb = change(cb);
if ((ka + 1) % 3 == kb) { // 甲胜
timesa[0] ++;
timesb[2] ++;
handsa[ka] ++;
} else if (ka == kb) { // 平局
timesa[1] ++;
timesb[1] ++;
} else if ((kb + 1) % 3 == ka){ // 乙胜
timesa[2] ++;
timesb[0] ++;
handsb[kb] ++;
}
}
cout << timesa[0] << ' ' << timesa[1] << ' ' << timesa[2] << endl;
cout << timesb[0] << ' ' << timesb[1] << ' ' << timesb[2] << endl;
int ida = 0, idb = 0; // 存储甲乙赢的最多的招数
for (int i = 0; i < 3; i ++)
{
if (handsa[i] > handsa[ida]) ida = i;
if (handsb[i] > handsb[idb]) idb = i;
}
cout << dechange(ida) << ' ' << dechange(idb) << endl;
}