前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1018 锤子剪刀布 (20 分)

1018 锤子剪刀布 (20 分)

作者头像
可爱见见
发布2019-09-09 16:01:08
9420
发布2019-09-09 16:01:08
举报
文章被收录于专栏:卡尼慕卡尼慕

1018 锤子剪刀布 (20 分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

代码语言:javascript
复制
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

代码语言:javascript
复制
5 3 2
2 3 5
B B

我的思路

首先读取输入个数,然后再一边读入双方的出拳一边计算输赢,自定义输赢函数来判断输赢和平手。然后使用vector来保存出拳情况完成第三行的输出,赢次数最多的出拳。

代码语言:javascript
复制
// 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差不太多。

代码语言:javascript
复制
#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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡尼慕 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入格式:
  • 输出格式:
  • 输入样例:
  • 输出样例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档