PAT B1018 锤子剪刀布(C++)

PAT甲级目录 | PAT乙级目录

题目描述

B1018 锤子剪刀布

也许陌生的知识点

  • map<char, int> m
    • 创建一个 map 变量,用于将手势映射为数字,方便处理。
  • if((m[a] - m[b] + 3) % 3 == 2){ }
    • 类似于剪刀石头布的循环制约游戏策略都可以这种模式进行判断,可自行画图理解。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <cstdio>
#include <map>
using namespace std;
char getans(int t[]){ // 返回赢的次数最多的手势
if(t[0] >= t[1]){
if(t[0] >= t[2]) return 'B';
else return 'J';
}else return 'C';
}
int main(){
int A_win = 0, A_lose = 0, Tie = 0, N, cnt_a[3] = {0}, cnt_b[3] ={0};
char a, b;
map<char, int> m; //记录手势与数字的映射
m['B'] = 0; m['C'] = 1; m['J'] = 2;
scanf("%d\n", &N);
for(int i = 0; i < N; i++){
scanf("%c %c\n", &a, &b);
if(a == b) Tie ++;
else if((m[a] - m[b] + 3) % 3 == 2){//满足该式时为 A 赢
A_win++;
cnt_a[m[a]]++;
}else{
A_lose++;
cnt_b[m[b]]++;
}
}
printf("%d %d %d\n%d %d %d\n", A_win, Tie, A_lose, A_lose, Tie, A_win);
printf("%c %c\n", getans(cnt_a), getans(cnt_b));
return 0;
}