P1018 锤子剪刀布

转跳点:🐑

 

1018 锤子剪刀布 (20分)
 

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

FigCJB.jpg

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

输入格式:

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

  这道题不算难题,就是注意排序方式,考察了多组输入字符比较,没什么特别大的坑,就是个人感觉三目运算会更简单的解决三个数比大小的问题。注意考虑相等的情况。
我写了两个函数的三个数比较和宏定义的三目运算三位数比较,代码较长。

 

  非宏定义

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int compared(int a, int b, int c);
 5 
 6 int main()
 7 {
 8     int n;
 9     char TypeMap[] = {'J', 'C', 'B'};
10     int Awin = 0, Bwin = 0, Nwin = 0;
11     int BJ = 0, BC = 0, BB = 0, AJ = 0, AC = 0, AB = 0;
12     char A, B;
13 
14     scanf("%d\n", &n);
15 
16     //开始统计各种次数
17     while (n--)
18     {
19         scanf("%c %c", &A, &B);
20         
21         //偷懒求了B C J差值
22         //A赢的情况8 ,-7, -1
23         //B赢的情况-8, 7, 1
24         switch (A - B)
25         {
26         case 0:                 //平局
27             Nwin++; 
28             break;
29         case 8:                 //J - B 
30             Awin++;
31             AJ++;
32             break;
33         case -7:                //C - J
34             Awin++;
35             AC++;
36             break;
37         case -1:                //B - C
38             Awin++;
39             AB++;
40             break;
41         case -8:                //B - J, 从这里往下乙赢
42             Bwin++;
43             BJ++;
44             break;
45         case 7:                 //J - B
46             Bwin++;
47             BC++;
48             break;
49         case 1:                 //C - B
50             Bwin++;
51             BB++;
52             break;
53         }
54         getchar();
55     }
56 
57     int BigA = compared(AJ, AC, AB);        
58     int BigB = compared(BJ, BC, BB);
59     
60     printf("%d %d %d\n", Awin, Nwin, Bwin);
61     printf("%d %d %d\n", Bwin, Nwin, Awin);
62     printf("%c %c\n", TypeMap[BigA], TypeMap[BigB]);
63     return 0;
64 }
65 
66 //三个数比大小
67 int compared(int a, int b, int c)
68 {
69     if (a > b)
70     {
71         if (a > c)
72         {
73             return 0;
74         }
75         else
76         {
77             return 2;
78         }
79     }
80     else
81     {
82         if (b > c)
83         {
84             return 1;
85         }
86         else
87         {
88             return 2;
89         }
90     }
91 }
View Code

 

  三目运算

 1 #include <stdio.h> 
 2 #include <stdlib.h>
 3 
 4 //三目运算三个数比大小
 5 #define cmp(a, b, c) a > b ? (a > c ?  0 : 2) : (b > c ? 1 : 2);
 6 
 7 int main()
 8 {
 9     int n;
10     char TypeMap[] = {'J', 'C', 'B'};
11     int Awin = 0, Bwin = 0, Nwin = 0;
12     int BJ = 0, BC = 0, BB = 0, AJ = 0, AC = 0, AB = 0;
13     char A, B;
14     
15     scanf("%d\n", &n);
16     
17     while (n--)
18     {
19         scanf("%c %c", &A, &B);
20         
21         switch (A-B)
22         {
23             case 0:Nwin++;break;
24             case 8:Awin++;AJ++;break;
25             case -7:Awin++;AC++;break;
26             case -1:Awin++;AB++;break;
27             case -8:Bwin++;BJ++;break;
28             case 7:Bwin++;BC++;break;
29             case 1:Bwin++;BB++;break;
30         }
31         getchar();//吞回车
32     }
33 
34      int BigA = cmp(AJ, AC, AB);
35      int BigB = cmp(BJ, BC, BB);
36 
37     printf("%d %d %d\n", Awin, Nwin, Bwin);
38     printf("%d %d %d\n",Bwin, Nwin, Awin);
39     printf("%c %c\n", TypeMap[BigA], TypeMap[BigB]);
40     return 0;
41 }
内联三目

  不用宏也可以,直接写个函数也行,鬼知道,宏会不会被编译器优化

 int cmp(char a, char b, char c) {return a > b ? (a > c ? 0 : 2) : (b > c ? 1 : 2);} 

   喜欢哪个用哪个吧

 

  PAT不易,诸君共勉!

 

posted @ 2020-01-07 20:44  秦_殇  阅读(162)  评论(0编辑  收藏  举报