大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
思路参考了算法笔记的哈:
只想说一句:变量多的一定不要写错变量名........检查起来好难
#include<iostream> using namespace std; int change_c(char c) { if (c == ‘B‘) return 0; if (c == ‘C‘) return 1; if (c == ‘J‘) return 2; } int main() { int n;//总共几轮 cin >> n; int wina = 0, winb = 0, ping = 0;//胜利次数 char c[3] = { ‘B‘,‘C‘,‘J‘ }; int at[3] = { 0 }, bt[3] = { 0 };//统计a,b用石头剪刀布的赢的次数的数组,a[0]表示用布赢的次数 int a, b; char ca, cb;//输入的a,b for (int i = 0; i < n; i++) { cin >> ca >> cb; a = change_c(ca), b = change_c(cb); if ((a + 1) % 3 == b) { //a胜 wina++; at[a]++;//统计a用石头剪刀布的赢的次数 } else if (a == b) { ping++; } else { //b赢 winb++; bt[b]++; } } cout << wina << " " << ping << " " << winb << endl; cout << winb << " " << ping << " " << wina << endl; //预测下次要出什么 int maxa = 0, maxb = 0; for (int i = 0; i < 3; i++) { if (at[i] > at[maxa]) maxa = i; if (bt[i] > bt[maxb]) maxb = i; } cout << c[maxa] << " " << c[maxb] << endl; std::system("pause"); return 0; }