PAT 乙级 1018 锤子剪刀布 (20) C++版

1018. 锤子剪刀布 (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第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


思路:比较输赢时用ACS码差值比较

 1 // 1018.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include<typeinfo>
 7 
 8 using namespace std;
 9 
10 int win = 0, lose = 0;//统计甲赢和输的次数
11 int X_times[3] = { 0 }, Y_times[3] = { 0 };//统计X和Y各项赢的次数
12 
13 //函数声明
14 void judge(char X, char Y);//比较函数
15 void show(int N);//打印函数
16 int get_max(int a[]);//求得最大数值的下标
17 
18 int main()
19 {
20     char X, Y;
21     int N;
22 
23     cin >> N;
24 
25     for (int i = 0; i < N; ++i)
26     {
27         cin >> X >> Y;
28 
29         judge(X, Y);
30     }
31 
32     show(N);
33 
34     return 0;
35 }
36 
37 //比较函数
38 void judge(char X, char Y)
39 {
40     //比较甲乙两人之间字母之差比较得出输赢
41     switch (static_cast<int>(X - Y))
42     {
43     case -1://B C
44         ++win;
45         ++X_times[0];
46         break;
47     case -8://B J
48         ++lose;
49         ++Y_times[2];
50         break;
51     case 1://C B
52         ++lose;
53         ++Y_times[0];
54         break;
55     case -7://C J
56         ++win;
57         ++X_times[1];
58         break;
59     case 8://J B
60         ++win;
61         ++X_times[2];
62         break;
63     case 7://J C
64         ++lose;
65         ++Y_times[1];
66     default://相等
67         break;
68     }
69 }
70 
71 //打印函数
72 void show(int N)
73 {
74     int max = 0, i;
75     char result[3] = { 'B', 'C', 'J' };
76 
77     cout << win << " " << N - win - lose << " " << lose << endl
78         << lose << " " << N - win - lose << " " << win << endl
79         << result[get_max(X_times)] <<" "
80         << result[get_max(Y_times)] << endl;
81 }
82 
83 //求得最大数值的下标
84 int get_max(int times[])
85 {
86     int i, max=0;
87 
88     for (i = 1; i < 3; i++)
89         if (times[max] < times[i])
90             max = i;
91 
92     return max;
93 }
原文地址:https://www.cnblogs.com/cdp1591652208/p/7237094.html