PAT乙级1018,锤子剪刀布(c++)

9 篇文章 0 订阅

思路在代码中已经注释。

#include<iostream>
using namespace std;
const int Maxn = 100101;
int N;
char dataMat[Maxn][2];
int hCJB[2][3];           //用于存储甲乙胜利时所出的牌
int hc1[2][3];            //用来存储甲乙的胜、平、分数量

int getValue(char a, char b){
    if(a == 'C' && b == 'J'){         //甲锤子胜乙剪刀返回1
        return 1;
    }
    else if(a == 'J' && b == 'C'){    //乙锤子胜甲剪刀返回-1
        return -1;
    }
    else if(a == 'C' && b == 'B'){    //乙布胜甲锤返回-2
        return -2;
    }
    else if(a == 'B' && b =='C'){     //甲布胜乙锤返回2
        return 2;
    }
    else if(a == 'J' && b == 'B'){    //甲剪刀胜乙布返回3
        return 3;
    }
    else if(a == 'B' && b == 'J'){    //乙剪刀胜甲布返回-3
        return -3;
    }
    else{                           //如果两人的出法一样,那么返回0
        return 0;
    }
}


int main(){
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            hc1[i][j] = 0;         //将他们都初始化为0;
            hCJB[i][j] = 0;
        }
    }
    cin>>N;                        //输入次数
    for(int i=0;i<N;i++){
        cin>>dataMat[i][0]>>dataMat[i][1];  //将甲乙的对局结果记录下来
    }
    for(int i=0;i<N;i++){                   //遍历记录下来的对局结果
        int flag = getValue(dataMat[i][0], dataMat[i][1]);
        if(flag == 1 || flag == 2 || flag == 3){  //返回1,2,3说明甲胜利
            hc1[0][0]++;                          //甲方胜利加一
            hc1[1][2]++;                          //乙方失败加一
            if(dataMat[i][0] == 'C'){             //判断甲方出的什么牌而获取的胜利,将其记录下来
                hCJB[0][1] += 1;                  //出锤子
            }
            else if(dataMat[i][0] == 'J'){        //出剪刀
                hCJB[0][2] += 1;
            }
            else{                                //出布
                hCJB[0][0] += 1;
            }
        }
        else if(flag == -1 || flag == -2 || flag == -3){ //返回-1,-2,-3时乙方胜利
            hc1[1][0]++;                          //乙方胜利加一
            hc1[0][2]++;                          //甲方胜利加一
            if(dataMat[i][1] == 'C'){             //判断乙方是出什么牌而获取胜利,将其记录下来
                hCJB[1][1] += 1;                  //出锤
            }
            else if(dataMat[i][1] == 'J'){        //出剪刀
                hCJB[1][2] += 1;
            }
            else{
                hCJB[1][0] += 1;                   //出布
            }
        }
        else{                                      //如果甲乙出牌相同,那么谁也不获胜,甲乙平局都加一
            hc1[0][1]++;
            hc1[1][1]++;
        }
    }

    for(int i=0;i<2;i++){                          //遍历输出甲乙的得分情况
        for(int j=0;j<2;j++){
            cout<<hc1[i][j]<<" ";
        }
        cout<<hc1[i][2]<<endl;
    }

    int max = -1;                                  //遍历查找甲乙胜利时使用的最多的牌的下标,然后根据下标判断输出这张牌
    int index = -1;                                //在记录甲乙胜利使用的牌时,已经按照字典序 B C J排序好了,所以找到下标直接判断输出即可。
    for(int i = 0;i<3;i++){
        if(hCJB[0][i] > max){
            max = hCJB[0][i];
            index = i;
        }
    }
    if(index == 0){                                //判断下标
        cout<<'B'<<" ";
    }
    else if(index == 1){
        cout<<'C'<<" ";
    }
    else{
        cout<<'J'<<" ";
    }

    max = -1;                                       //如上所述思路和做法完全相同
    index = -1;
    for(int i = 0;i<3;i++){
        if(hCJB[1][i] > max){
            max = hCJB[1][i];
            index = i;
        }
    }
    if(index == 0){
        cout<<'B';
    }
    else if(index == 1){
        cout<<'C';
    }
    else{
        cout<<'J';
    }
}

运行结果:
运行结果图
菜鸡的成长之路,欢迎大佬指正错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值