天天看點

1018 錘子剪刀布 (20 分)

1018 錘子剪刀布 (20 分)

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,并且給出雙方分别出什麼手勢的勝算最大。

輸入格式:

輸入第 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           

複制

我的思路

首先讀取輸入個數,然後再一邊讀入雙方的出拳一邊計算輸赢,自定義輸赢函數來判斷輸赢和平手。然後使用vector來儲存出拳情況完成第三行的輸出,赢次數最多的出拳。

// 1018 錘子剪刀布 (20 分).cpp : 此檔案包含 "main" 函數。程式執行将在此處開始并結束。
//

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//判斷輸赢
//傳回:3:平;2:B赢;1:A赢。
int judgeWin(char A, char B) {
    if (A == B)
        return 3;
    //A是錘子
    if (A == 'C') {
        //B是剪刀
        if (B == 'J')
            return 1;
        //B是布
        else if (B == 'B') {
            return 2;
        }
    }
    //A是剪刀
    else if (A == 'J') {
        //B是布
        if (B == 'B')
            return 1;
        else if (B == 'C')
            return 2;
    }
    else if(A == 'B'){
        if (B == 'J')
            return 2;
        else if (B == 'C')
            return 1;
    }
    return 0;
}

//統計出現最多次數的字元
char Max_appear(vector<char> a) {
    int number_c = 0;
    int number_b = 0;
    int number_j = 0;
    for (int i = 0; i < a.size(); i++) {
        if (a[i] == 'B')
            number_b++;
        else if (a[i] == 'C')
            number_c++;
        else
            number_j++;
    }
    if (number_b >= number_c && number_b >= number_j)
        return 'B';
    if (number_c >= number_b && number_c >= number_j)
        return 'C';
    if (number_j >= number_c && number_j >= number_b)
        return 'J';
    return 0;
}

int main(){
    //輸入
    int number_battle;
    char A, B;
    cin >> number_battle;
    int i = number_battle;
    vector<char> a;
    vector<char> b;
    int a_win = 0;
    int b_win = 0;
    int equal = 0;
    //輸入同時記錄
    while (i) {
        cin >> A >> B;
        //甲赢
        if (judgeWin(A, B) == 1) {
            a.push_back(A);
            a_win++;
        }
        else if (judgeWin(A, B) == 2) {
            b.push_back(B);
            b_win++;
        }
        else {
            equal++;
        }
        i--;
    }
    cout << a_win << " " << equal << " " << number_battle - a_win - equal << endl;
    cout << b_win << " " << equal << " " << number_battle - b_win - equal<< endl;
    cout << Max_appear(a) << " " << Max_appear(b);
}
           

複制

一次就跑成功了,我覺得唯一要注意的點就是按字母順序輸出那裡,先判斷B然後C最後J就可以了。不是最優化的代碼,看看别人部落格的代碼。感覺ummmm差不太多。

#include<iostream>
using namespace std;
void AlterCh(char c,char &ch)//判定哪個手勢赢 
{
    if(c=='C')
    ch='C';
    else if(c=='J')
    ch='J';
    else
    ch='B';
}
int Judge(char ch1,char ch2,char &ch)//判定赢的一家及赢的手勢 
{
    if(ch1==ch2)
    return 0;//若平則傳回0
    if(ch1=='C'&&ch2=='J'||ch1=='J'&&ch2=='B'||ch1=='B'&&ch2=='C')
    {//若甲赢則記錄手勢并傳回1 
        AlterCh(ch1,ch);
        return 1;
    }
    AlterCh(ch2,ch);
    return -1;//若乙赢則記錄手勢并傳回-1
}
void Handle(int *a,char ch)//統計勝利及手勢赢的次數 
{
    a[3]++;
    if(ch=='C')
    a[0]++;
    else if(ch=='J')
    a[1]++;
    else 
    a[2]++;
}
char Compare(int cntC,int cntJ,int cntB)//比較各赢的手勢次數 
{
    if(cntB>=cntJ&&cntB>=cntC)
    return 'B';
    else if(cntC>cntB&&cntC>=cntJ)
    return 'C';
    else
    return 'J';
}
int main()
{//a[i]:i=0-2:C,J,B赢的次數, i=3,4:勝,平的次數 
    int N,A[5]={0},B[5]={0};
    char ch1,ch2,ch;
    cin>>N;
    while(N--)
    {
        cin>>ch1>>ch2;
        if(Judge(ch1,ch2,ch)==1)
        Handle(A,ch);
        else if(Judge(ch1,ch2,ch)==-1)
        Handle(B,ch);
        else 
        {//統計平的次數 
            A[4]++;
            B[4]++;
        }
    }
    cout<<A[3]<<' '<<A[4]<<' '<<B[3]<<endl;
    cout<<B[3]<<' '<<B[4]<<' '<<A[3]<<endl;
    cout<<Compare(A[0],A[1],A[2])<<' '<<Compare(B[0],B[1],B[2]);
    return 0;
}
————————————————
版權聲明:本文為CSDN部落客「18Temp」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/qq_37729102/article/details/81673773
           

複制