天天看点

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
           

复制