【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 }
posted on 2018-08-19 19:58  Pink.Pig  阅读(2289)  评论(0编辑  收藏  举报