PAT乙级测试题1018(C语言实现)

1018 锤子剪刀布 (20分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
PAT乙级测试题1018(C语言实现)_第1张图片

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

输入第 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
PAT乙级测试题1018(C语言实现)_第2张图片

/*
 * 思路:统计出甲的赢平输次数,当其赢时,统计甲所出的CJB个数,当其输时,统计乙的CJB个数
 * 判断后输出,注意如果解不唯一,则输出按字母序最小的解。
 */
#include 

int main(){
    int N,awin=0,alose=0,ping=0,a1=0,a2=0,a3=0,b1=0,b2=0,b3=0;
    scanf("%d", &N);
    char a[N][2],k;
    for (int i = 0; i < N; ++i) {
        scanf("%c%c %c",&k,&a[i][0], &a[i][1]);//需要将换行符读取
        if ((a[i][0]=='C'&&a[i][1]=='J')||(a[i][0]=='J'&&a[i][1]
           =='B')||(a[i][0]=='B'&&a[i][1]=='C')){//此为甲赢的情况
            awin++;
            switch (a[i][0]) {//统计甲CJB个数
                case 'C':a1++;break;
                case 'J':a2++;break;
                case 'B':a3++;break;
            }
        }
        else if (a[i][0]==a[i][1])
            ping++;
        else {//此为乙赢的情况
            alose++;
            switch (a[i][1]) {//统计乙CJB个数
                case 'C':b1++;break;
                case 'J':b2++;break;
                case 'B':b3++;break;
            }
        };
    }
    printf("%d %d %d\n%d %d %d\n",
           awin,ping,alose,alose,ping,awin);
    //按字母序判断并输出甲最多的出法
    if (a3>=a2 && a3>=a1)printf("%c ",'B');
    else if (a1>=a2 && a1>=a3)printf("%c ",'C');
    else printf("%c ",'J');
    //按字母序判断并输出乙最多的出法
    if (b3>=b2 && b3>=b1)printf("%c",'B');
    else if (b1>=b2 && b1>=b3)printf("%c",'C');
    else printf("%c",'J');
    return 0;
}

你可能感兴趣的:(pta)