【问题描述】
大家应该都会玩“锤子剪刀布”的游戏。现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
【输入形式】
输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。
按照字母顺序将布 锤子 剪刀用0 1 2编码, 当甲出的手势编码减去乙出的手势编码等于下图中每列的值时, 分别有三种情况
例如甲出锤子(为1), 乙出剪刀(为2), 相减=-1, 结果是获胜.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int count[2][3]; //记录获胜的手势,B-0 C-1 J-2
int score[2][3]; //得分. 懒得初始化, 直接全局变量
int main()
{
unordered_map<char, int> maps{
{'B', 0},
{'C', 1},
{'J', 2}};
unordered_map<char, int> mapss{
{0, 'B'},
{1, 'C'},
{2, 'J'}}; //反映射回来....用值查找键比较麻烦, 所以又弄了一个映射
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
char o, p;
cin >> o >> p;
int a = maps[o], b = maps[p];
int dv = a - b; //关键部分
if (dv == 0)
{
score[0][1]++;
score[1][1]++;
}
else if (dv == -2 || dv == 1)
{ //甲输了
//count[0][2]++; 甲没有变化
count[1][b]++;
score[0][2]++;
score[1][0]++;
}
else /*if(dv == 2 || dv == -1)*/
{ //甲赢了
count[0][a]++;
//count[1][b]++; //乙没有变化
score[0][0]++;
score[1][2]++;
}
}
for (int i = 0; i < 2; i++)
{ //输出 胜 平 负\n
cout << score[i][0];
for (int j = 1; j < 3; j++)
{
cout << " " << score[i][j];
}
cout << endl;
}
bool flag = false; //控制输出空格
for (int i = 0; i < 2; i++)
{ //获胜次数最多的手势
int max = -1, m;
for (int j = 0; j < 3; j++)
if (count[i][j] > max)
{
max = count[i][j];
m = j;
}
if (flag)
cout << " ";
cout << char(mapss[m]);
flag = !flag;
}
return 0;
}