PAT (Basic Level) Practice (中文)1018 锤子剪刀布 (20 分)(C++实现)

题目描述:

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

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

输入格式:

输入第 1 行给出正整数 N 1 0 5 ) 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>
#include <iostream>

using namespace std;

// // 函数声明
int result(char a, char b);
int max(int a, int b);

int main() 
{
    int count = 0;
    // scanf("%d", &count);
    cin >> count;

    int arr1[3];
    int arr2[3];
    for (int i = 0; i < 3; i++) {
        arr1[i] = 0;
        arr2[i] = 0;
    }

    // 记录每一种手势赢得个数
    int asign[26];
    int bsign[26];

    for (int i = 0; i < 26; i++)
    {
        asign[i] = 0;
        bsign[i] = 0;
    }

    for (int i = 0; i < count; i++) {
        char c1, c2;

        // scanf("%c", &c1);
        // scanf("%c", &c2);
        cin >> c1 >> c2;

        int status = result(c1, c2);

        // 如果 平局
        switch (status) {
            case 0:
                arr1[1]++;
                arr2[1]++;
                break;
            case 1:
                // 如果 a 胜利
                arr1[0]++;
                arr2[2]++;
                asign[c1 - 'A']++;
                break;
            case -1:
                // 如果 b 胜利
                arr2[0]++;
                arr1[2]++;
                bsign[c2 - 'A']++;
        }
    }

    printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);
    printf("%d %d %d\n", arr2[0], arr2[1], arr2[2]);

    int amax = max(asign['B' - 'A'], max(asign['C' - 'A'], asign['J' - 'A']));
    int bmax = max(bsign['B' - 'A'], max(bsign['C' - 'A'], bsign['J' - 'A']));

    // cout << amax << "  ,  " << bmax << endl;
    // cout << asign['B' - 'A'] << ", " << asign['C' - 'A'] << ", " << asign['J' - 'A'] << endl;
 
    // 输出结果
    char a, b;
    // 处理 a
    if (amax == asign['B' - 'A']) {
        a = 'B';
    } else if (amax == asign['C' - 'A']) {
        a = 'C';
    } else {
        a = 'J';
    }

    // 处理 b
    if (bmax == bsign['B' - 'A']) {
        b = 'B';
    } else if (bmax == bsign['C' - 'A']) {
        b = 'C';
    } else {
        b = 'J';
    }

    printf("%c %c\n", a, b);

    return 0;
}

int max(int a, int b)
{
    return a > b ? a : b;
}

int result(char a, char b) {
    if (a == b)
        return 0;
    if ((a == 'B' && b == 'C') || (a == 'C' && b == 'J') || (a == 'J' && b == 'B')) 
        return 1;
    return -1;
}

代码实现(Java实现,但是最后一个点过不去)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;

/**
 * @author snowflake
 * @create-date 2019-07-18 18:40
 */
public class Main {

    /**
     * 总共有九种情况 
     */
    static Map<String, Integer> statusMap = new HashMap<>();

    static {
        statusMap.put("BB", 0);
        statusMap.put("CC", 0);
        statusMap.put("JJ", 0);

        statusMap.put("BC", 1);
        statusMap.put("CJ", 1);
        statusMap.put("JB", 1);

        statusMap.put("CB", -1);
        statusMap.put("JC", -1);
        statusMap.put("BJ", -1);
    }

    public static void main(String[] args) throws IOException {
        Reader.init(System.in);

        int[] arr1 = new int[3];
        int[] arr2 = new int[3];

        // 记录每一种手势赢的个数
        // a
        int[] asign = new int[26];
        int[] bsign = new int[26];

        int count = Reader.nextInt();

        for (int i = 0; i < count; i++) {
            int c1 = Reader.next().charAt(0);
            int c2 = Reader.next().charAt(0);

            int status = result(c1, c2);
            
            // 如果 平局
            switch (status) {
                case 0:
                    arr1[1]++;
                    arr2[1]++;
                    break;
                case 1:
                    // 如果 a 胜利
                    arr1[0]++;
                    arr2[2]++;
                    asign[c1 - 'A']++;
                    break;
                case -1:
                    // 如果 b 胜利
                    arr2[0]++;
                    arr1[2]++;
                    bsign[c2 - 'A']++;
                    break;
                default:
            }
        }

        // 输出每人的对应的次数
        System.out.println(arr1[0] + " " + arr1[1] + " " + arr1[2]);
        System.out.println(arr2[0] + " " + arr2[1] + " " + arr2[2]);

        // 输出最熟练的手势
        // 获取每人最熟练的赢的次数
        int amax = Math.max(Math.max(asign['B' - 'A'], asign['C' - 'A']), asign['J' - 'A']);
        int bmax = Math.max(Math.max(bsign['B' - 'A'], bsign['C' - 'A']), bsign['J' - 'A']);

        // 输出结果
        String a, b;
        // 处理 a
        if (amax == asign['B' - 'A']) {
            a = "B";
        } else if (amax == asign['C' - 'A']) {
            a = "C";
        } else {
            a = "J";
        }

        // 处理 b
        if (bmax == bsign['B' - 'A']) {
            b = "B";
        } else if (bmax == bsign['C' - 'A']) {
            b = "C";
        } else {
            b = "J";
        }

        System.out.println(a + " " + b);
    }

    /**
     *
     * @param a a 字符
     * @param b b 字符
     * @return  0: 平局 -1:a 输 b 赢 1:a 赢 b 输
     */
    public static int result(int a, int b) {
        // 如果两个字符一样,平局
        return statusMap.get((char) a + "" + (char) b);
    }

}

class Reader {

    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) {
        reader = new BufferedReader(new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    }

    /** get next word */
    static String next() throws IOException {
        while (!tokenizer.hasMoreTokens())
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

}

发布了80 篇原创文章 · 获赞 13 · 访问量 9276

猜你喜欢

转载自blog.csdn.net/qq_39424178/article/details/96628114
今日推荐