大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤10^5),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C
代表“锤子”、J
代表“剪刀”、B
代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
经过我试错PAT测试点2会出现一个CJB相同的情况
本来想使用getline但是各种原因好像没办法正确读入,只是读入然后整个输出是没问题,但是一旦通过下标输出空格以后的字母就会出问题,进行断点,发现读入的字符串找不到东西,不知道怎么回事就出现空行,所以只能分开读入。
#include<iostream>
using namespace std;
//求的手势最多的函数
int maxgesture(int a[], char g[]);
int main() {
int n;
cin >> n;
// 记录A和B各个手势赢得次数0,1,2分别代表锤子剪刀布
int awg[3] = { 0 }, bwg[3] = { 0 };
// 平的次数
int p = 0;
for (int i = 0; i < n; i++) {
char ji, yi;
cin >> ji >> yi;
if (ji == yi) {
p++;
}
else if (ji == 'C' && yi == 'J') {
awg[0]++;
}
else if (ji == 'C' && yi == 'B') {
bwg[2]++;
}
else if (ji == 'J' && yi == 'B') {
awg[1]++;
}
else if (ji == 'J' && yi == 'C') {
bwg[0]++;
}
else if (ji == 'B' && yi == 'C') {
awg[2]++;
}
else if (ji == 'B' && yi == 'J') {
bwg[1]++;
}
}
int suma = awg[0] + awg[1] + awg[2], sumb = bwg[0] + bwg[1] + bwg[2];
cout << suma << " " << p << " " << n - p - suma << endl;
cout << sumb << " " << p << " " << n - p - sumb << endl;
// 找到赢的次数最多的手势
char gesture[3] = { 'C','J','B' };
cout << gesture[maxgesture(awg, gesture)] << " " << gesture[maxgesture(bwg, gesture)];
return 0;
}
int maxgesture(int a[], char g[]) {
int temp = 0;
for (int i = 1; i <= 2; i++) {
if (a[temp] == a[i]) {
temp = g[temp] < g[i] ? temp : i;
}
else if (a[temp] < a[i]) {
temp = i;
}
}
return temp;
}