【PAT】1018 锤子剪刀布 (20)(20 分)
1018 锤子剪刀布 (20)(20 分)
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第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
C++代码如下:
1 #include<iostream> 2 3 using namespace std; 4 5 struct info { 6 int num; //不同手势转换后的数字 7 int vict=0; //赢的次数 8 int equ=0; //平的次数 9 int defe=0; //输的次数 10 int ans[3] = { 0,0,0 }; //数组三个元素对应的分别为手势 C、J、B赢的次数 11 }; 12 const int data_s[3][3] = { { 0,1,-1 }, //根据手势对应的数字查表,值为1表示甲赢乙输 13 { -1,0,1 }, //值为0表示甲乙平 14 { 1,-1,0 } }; //值为-1表示甲输乙赢 15 16 char gesture(const info &a) { //赢的次数最多的手势 17 if (a.ans[0] > a.ans[1]) { 18 if(a.ans[0]<=a.ans[2]) return 'B'; 19 else return 'C'; 20 } 21 else if (a.ans[0] == a.ans[1]) { 22 if (a.ans[0] <= a.ans[2]) return 'B'; 23 else return 'C'; 24 } 25 else { 26 if (a.ans[1] <= a.ans[2]) return 'B'; 27 else return 'J'; 28 } 29 } 30 int transform(const char c) { //将不同的手势转换成数字方便查表 31 if (c == 'C') return 0; 32 else if (c == 'J') return 1; 33 else if (c == 'B') return 2; 34 } 35 36 int main() { 37 int n; 38 cin >> n; 39 info a, b; 40 char ah, bh; 41 while (n--) { 42 cin >> ah >> bh; 43 a.num = transform(ah); 44 b.num = transform(bh); 45 if (data_s[a.num][b.num] == 1) { 46 a.vict++; 47 a.ans[a.num]++; //将对应手势赢的次数加1 48 b.defe++; 49 } 50 else if (data_s[a.num][b.num] == -1) { 51 b.vict++; 52 b.ans[b.num]++; //将对应手势赢的次数加1 53 a.defe++; 54 } 55 else { 56 a.equ++; 57 b.equ++; 58 } 59 } 60 cout << a.vict << ' ' << a.equ << ' ' << a.defe << endl; 61 cout << b.vict << ' ' << b.equ << ' ' << b.defe << endl; 62 cout << gesture(a) << ' ' << gesture(b) << endl; 63 return 0; 64 }