大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
- 输入
输入第1行给出正整数N(<=105),即双方交锋的次数。随后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
方法(1) 只用统计甲和乙各自赢的次数,n-(j_win + y_win) = 平局的次数 str[4];手势字符串,j[3], y[3],统计每个手势获胜的次数 max_j : 获胜次数最多手势,在str中的索引
#include <iostream>
using namespace std;
int main() {
char str[4] = {"CJB"},a , b;
int j_win = 0 , y_win = 0, n;
int j[3] = {0}, y[3] = {0};
cin >>n;
for (int i = 0; i < n ; i++) {
cin >> a >> b; //甲乙的手势
if (a == 'C' && b == 'J') {
j_win++;
j[0]++;
} else if (a == 'C' && b == 'B') {
y_win++;
y[2]++;
} else if (a == 'J' && b == 'B') {
j_win++;
j[1]++;
} else if (a == 'J' && b == 'C') {
y_win++;
y[0]++;
} else if (a == 'B' && b == 'J') {
y_win++;
y[1]++;
} else if (a == 'B' && b == 'C') {
j_win++;
j[2]++;
}
}
int max_j = j[0] >= j[1] ? 0 : 1;
max_j = j[max_j] >= j[2] ? max_j : 2;
int max_y = y[0] >= y[1] ? 0 : 1;
max_y = y[max_y] >= y[2] ? max_y : 2;
cout <<j_win<<' '<<n-(j_win+y_win)<<' '<<y_win<<endl;
cout <<y_win<<' '<<n-(j_win+y_win)<<' '<<j_win<<endl;
cout <<str[max_j]<<' '<<str[max_y]<<endl;
return 0;
}
方法(二): 布:B, 锤:C,剪:J,按照字典顺序转化为数字 B : 0, C : 1, J : 2; 举个例子:
if (((int)a + 1) %3 == (int)b):
j_win++;
j[(int)a]++;
(int)a ,(int) b并真正的强制类型转化,只是表示将,a,b甲乙的手势字符,转化为对应的数字 如果甲>乙:C > J (1+1)%3=2 = J,所以 甲win.
#include <iostream>
using namespace std;
int transform(char c) {
if (c == 'B') return 0;
if (c == 'C') return 1;
if (c == 'J') return 2;
}
int main() {
char str[4] = "BCJ",a , b;
int j_win = 0 , y_win = 0, n;
int j[3] = {0}, y[3] = {0};
cin >>n;
for (int i = 0; i < n ; i++) {
cin >> a >> b;
int k1 = transform(a);
int k2 = transform(b);
if ((k1+1)%3 == k2) {
j_win++;
j[k1]++;
}
else if (k1 == k2)
continue;
else {
y_win++;
y[k2]++;
}
}
int max_j = j[0] >= j[1] ? 0 : 1;
max_j = j[max_j] >= j[2] ? max_j : 2;
printf("%d %d %d",j[0],j[1],j[2]);
int max_y = y[0] >= y[1] ? 0 : 1;
max_y = y[max_y] >= y[2] ? max_y : 2;
cout <<j_win<<' '<<n-(j_win+y_win)<<' '<<y_win<<endl;
cout <<y_win<<' '<<n-(j_win+y_win)<<' '<<j_win<<endl;
cout <<str[max_j]<<' '<<str[max_y]<<endl;
return 0;
}