PAT乙級1018

1018 錘子剪刀布 (20分)

題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344ios

你們應該都會玩「錘子剪刀布」的遊戲:兩人同時給出手勢,剪刀勝布,布勝錘子,錘子勝剪刀,相同平局。現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,而且給出雙方分別出什麼手勢的勝算最大。函數

輸入格式:

輸入第 1 行給出正整數 N(≤100000),即雙方交鋒的次數。隨後 N 行,每行給出一次交鋒的信息,即甲、乙雙方同時給出的的手勢。C 表明「錘子」、J 表明「剪刀」、B 表明「布」,第 1 個字母表明甲方,第 2 個表明乙方,中間有 1 個空格。spa

輸出格式:

輸出第 一、2 行分別給出甲、乙的勝、平、負次數,數字間以 1 個空格分隔。第 3 行給出兩個字母,分別表明甲、乙獲勝次數最多的手勢,中間有 1 個空格。若是解不惟一,則輸出按字母序最小的解。後面那個輸出獲勝最多的手勢我感受邏輯很容易出現遺漏的狀況。code

輸入樣例

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

個人理解

咱們那這個遊戲叫作剪刀石頭布,可是規則是同樣的。統計的時候,統計甲乙任意一方的便可,由於其是互補關係,甲勝則意味着乙敗,乙勝則意味着甲敗,平局二者均相等。排序

  1. 僅統計甲乙方任一方的勝敗次數便可,輸出勝敗次數時反向輸出就是另外一方的結果。
  2. 輸出獲勝最多的手勢,實則也是按照多種規則嵌套排序的問題,認真思考,不要遺漏狀況。

代碼段

#include <iostream>
using namespace std;
// 找到獲勝次數最多的手勢
char findResultGesture(int winGesture[]);

int main() {
    int N = 0;
    cin >> N;
    // 甲、乙每次出的手勢
    char first = ' ';
    char second = ' ';
    // 甲、乙按照B、C、J的順序獲勝的次數
    int firstWinGesture[] = {0, 0, 0};
    int secondeWinGesture[] = {0, 0, 0};
    // 甲的勝,平,負次數
    int win = 0, draw = 0, defeat = 0;
    for (int i = 0; i < N; i++) {
        cin >> first >> second;
        // 平局
        if (first == second) {
            draw++;
            // 甲勝
        } else if ((first == 'C' && second == 'J') || (first == 'J' && second == 'B') || (first == 'B' && second == 'C')) {
            win++;
            switch (first) {
                case 'B':
                    firstWinGesture[0]++;
                    break;
                case 'C':
                    firstWinGesture[1]++;
                    break;
                case 'J':
                    firstWinGesture[2]++;
                    break;
                default:
                    break;
            }
            // 乙勝
        } else {
            defeat++;
            switch (second) {
                case 'B':
                    secondeWinGesture[0]++;
                    break;
                case 'C':
                    secondeWinGesture[1]++;
                    break;
                case 'J':
                    secondeWinGesture[2]++;
                    break;
                default:
                    break;
            }
        }
    }
    cout << win << " " << draw << " " << defeat << endl;
    cout << defeat << " " << draw << " " << win << endl;
    cout << findResultGesture(firstWinGesture) << " " << findResultGesture(secondeWinGesture) << endl;
    return 0;
}

char findResultGesture(int winGesture[]) {
    int a = winGesture[0];
    int b = winGesture[1];
    int c = winGesture[2];
    // 三者均不相等
    if (a != b && b != c && a != c) {
        return a > b ? (a > c ? 'B' : 'J') : (b > c ? 'C' : 'J');
    } else {
        if (a == b && b != c) {
            return a > c ? 'B' : 'J';
        } else if ((b == c && c != a) || (a == c && c != b)) {
            return a > b ? 'B' : 'C';
        // 三者相等 a == b == c
        } else {
            return 'B';
        }
    }
}

更改過程

  1. 在找到獲勝最多的手勢findResultGesture函數中,遺漏了狀況,在三者均不相等的else裏面,if (a == b),時,有可能出現a == b == c的狀況,此時裏面的if(a > c)將會返回字符J,可是當a == b == c時,應該返回字符‘B'。遊戲

    char findResultGesture(int winGesture[]) {
        int a = winGesture[0];
        int b = winGesture[1];
        int c = winGesture[2];
        // 三者均不相等
        if (a != b && b != c && a != c) {
            if (a > b) {
                if (a > c) {
                    return 'B';
                } else {
                    return 'J';
                }
            } else {
                if (b > c) {
                    return 'C';
                } else {
                    return 'J';
                }
            }
        } else {
            if (a == b) {
                if (a > c) {
                    return 'B';
                } else {
                    return 'J';
                }
            } else {
                if (a > b) {
                    return 'B';
                } else {
                    return 'C';
                }
            }
        }
    }
  2. 還有if() else這種返回值的寫法,可使用三目運算符進行簡寫,可能效率也會高一點吧。ci

相關文章
相關標籤/搜索