B1018. 锤子剪刀布

84417613 2020-01-01

题目描述

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

B1018. 锤子剪刀布

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

输入格式

第一行给出正整数N (≤ 105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的手势。C代表"锤子"、J代表"见到"、B代表"布",第一个字母代表甲方,第二个字母代表乙方,中间有一个空格

输出格式

第一、二行分别给出甲、乙的胜、平、负次数,数字间以一个空格分隔。第三行给出两个字母,分别表示甲、乙获胜次数最多的手势,中间有一个空格

如果解不唯一,则输出按字典序最小的解

输入样例

10

CJ

JB

CB

BB

BC

CC

CB

JB

BC

JJ

输出样例

5 3 2 

2 3 5

B B

#include <bits/stdc++.h>
int change(char c){
    if(c == ‘B‘){
        return 0;
    }
    if(c == ‘C‘){
        return 1;
    }
    if(c == ‘J‘){
        return 2;
    }
}
char unchange(int n){
    if(n == 0){
        return ‘B‘;
    }
    if(n == 1){
        return ‘C‘;
    }
    if(n == 2){
        return ‘J‘;
    }
}
int main(int argc, char *argv[]) {
    int n;     
    scanf("%d", &n);// 记录行数
    int times_A[3] = {0, 0, 0}, times_B[3] = {0, 0, 0}; // 记录甲乙胜平负次数 
    char c1, c2;
    int k1, k2;
    int count1[3] = {0, 0, 0}, count2[3] = {0, 0, 0};// 记录甲、乙获胜次数 
    int max1, max2, index1, index2;// 记录最大值和最大值对应的数组下标
    for(int i = 0; i < n; i++){
        getchar();
        scanf("%c %c", &c1, &c2);
        // 将手势转为数字 
        k1 = change(c1);
        k2 = change(c2);
        // 甲赢 
        if((k1 + 1)%3 == k2){
            times_A[0]++;
            times_B[2]++;
            count1[k1]++;
        // 平手 
        }else if(k1 == k2){
            times_A[1]++;
            times_B[1]++;
        // 乙赢 
        }else if((k2 + 1)%3 == k1){
            times_A[2]++;
            times_B[0]++;
            count2[k2]++;
        }
    }         
    printf("%d %d %d\n", times_A[0], times_A[1], times_A[2]);    
    printf("%d %d %d\n", times_B[0], times_B[1], times_B[2]);
    max1 = count1[0];
    max2 = count2[0];
    index1 = 0;
    index2 = 0;
    for(int i = 1;i < 3; i++){
        if(max1 < count1[i]){
            max1 = count1[i];
            index1 = i;
        }
        if(max2 < count2[i]){
            max2 = count2[i];
            index2 = i;
        }
    }
    printf("%c %c", unchange(index1), unchange(index2));
    return 0;    
}

题解关键

  • 计算胜平负的时候,将表示手势的字母按照字典序转化为数字的计算,B、C、J,分别转换为 0、1、2,0胜1,1胜2,2胜0,循环判断

相关推荐