1018

作者: 笔墨流年乱浮生 | 来源:发表于2018-09-07 12:01 被阅读0次

    //1018 锤子剪刀布(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:

    #include <stdio.h>
    char cmp(int winC,int winB,int winJ);
    int main()
    {
        int N;
        char line[5];//用于放每次处理的字符串,因为每次"字母 空格 字母 \n \0"
        int AwinB = 0,AwinC = 0,AwinJ = 0;
        int BwinB = 0,BwinC = 0,BwinJ = 0;
        int ping = 0;
        scanf("%d", &N);
        while ( getchar() != '\n');//现在缓冲区里存放的是1 0 '\n' '\0',这条语句的意义是清空缓存区?
        for (int i = 0; i < N; i++) {
            fgets(line, 5, stdin);//从标准输入中读入4(5-1)个字符,存储在line中
            if (line[0] == line[2]) ping++;
            if (line[0] == 'B' && line[2] == 'C') AwinB++;
            if (line[0] == 'B' && line[2] == 'J') BwinJ++;
            if (line[0] == 'C' && line[2] == 'B') BwinB++;
            if (line[0] == 'C' && line[2] == 'J') AwinC++;
            if (line[0] == 'J' && line[2] == 'B') AwinJ++;
            if (line[0] == 'J' && line[2] == 'C') BwinC++;
        }
        
        int Awin = AwinC + AwinB + AwinJ;
        int Bwin = BwinC + BwinB + BwinJ;
        printf("%d %d %d\n", Awin, ping,Bwin);
        printf("%d %d %d\n", Bwin, ping,Awin);
        printf("%c %c",cmp(AwinC, AwinB, AwinJ),cmp(BwinC, BwinB, BwinJ));
        return 0;
    }
    char cmp(int winC,int winB,int winJ)
    {
        char f;
        if (winB >= winC && winB >= winJ) f = 'B';//等号只能出现一次,出现在字母序小的上
        if (winC > winB && winC >= winJ) f = 'C';
        if (winJ > winB && winJ > winC)  f = 'J';
        return f;
    }
    

    这道题做了蛮久,一方面是对多行数据输入的处理不熟悉,花了较长时间去看了getchar 和 fgets,主要问题 while ( getchar() != '\n');的作用,目前分析看来是为了把缓冲区里的N给清除,防止后面fgets的时候错读,不知道是否理解正确。

    另外这题OliverLew的比较函数有多个出口,翁恺老师说尽量单一出口,因此对比较函数做了变动。

    相关文章

      网友评论

          本文标题:1018

          本文链接:https://www.haomeiwen.com/subject/hetcgftx.html