PAT 1018 錘子剪刀布

只圖成果發表於2021-01-01

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。
輸入格式
輸入第1行給出正整數N(<=105),即雙方交鋒的次數。隨後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
#include <iostream>
using namespace std;

int change(char c){ //將三個手勢對應轉換為數字
    if(c == 'B') return 0;
    if(c == 'C') return 1;
    if(c == 'J') return 2;
    
    return -1;
}

int main(){
    char mp[3] = {'B', 'C', 'J'}; //用字元陣列mp[0 ~ 2]代表BCJ 方便的是在最後輸出時做一個轉換
    
    //countA[0 ~ 2] 代表甲 贏平負的次數 countB 代表乙
    //victoryA[0 ~ 2] 代表甲使用 布錘剪 獲勝的次數 victoryB代表乙
    int countA[3] = {0}, countB[3] = {0}, victoryA[3] = {0}, victoryB[3] = {0};
    
    int n; //交鋒場數
    cin >> n;
    char c1, c2; //輸入甲 乙的 手勢
    int k1, k2; //k1代表 甲手勢轉化後的數字, k2代表乙的
    for(int i = 0; i < n; i++){
        cin >> c1 >> c2;
        k1 = change(c1); //轉化為數字
        k2 = change(c2);
        
        /*
            由於設定的順序是字典序 且恰好就是迴圈相剋順序,因此
            k1 勝 k2 的條件就是(k1 + 1) % 3 == k2;
            k1 平 k2 的條件就是 k1 == k2;
            
            k1   k2
            0  >  1  布 大 石
            1  >  2  石 大 剪
            2  >  0  剪 大 布
            
            很顯然我們 想要 k1 勝利的話 只有在 (k1 + 1) % 3 == k2 時條件成立(很顯然我這句話也是廢話QAQ)
            總之我們理解 記住就好,慢慢來,一點一點積累~
        */
        if((k1 + 1) % 3 == k2){
            countA[0]++; //甲獲勝次數 加一
            countB[2]++; //乙失敗次數 加一
            victoryA[k1]++; //甲使用 k1 手勢獲勝的 次數加一
        }
        else if(k1 == k2){
            countA[1]++; //平
            countB[1]++;
        }
        else{
            countA[2]++; //甲輸
            countB[0]++; //乙贏
            victoryB[k2]++; //乙使用 k2 手勢獲勝的 次數加一
        }
    }
    
    cout << countA[0] << " " << countA[1] << " " << countA[2] << endl;
    cout << countB[0] << " " << countB[1] << " " << countB[2] << endl;
    
    int max1 = 0, max2 = 0;
    for(int i = 1; i < 3; i++){ //找出甲乙獲勝次數最多的手勢(即下標0~2 代表布錘剪) 
        if(victoryA[i] > victoryA[max1]) max1 = i;
        if(victoryB[i] > victoryB[max2]) max2 = i;
    }
    
    cout << mp[max1] << " " << mp[max2] << endl; 
    //因為輸出的是字元而不是數字 所以通過mp陣列之前記錄對應的手勢 轉化為BCJ
    return 0;
}

相關文章