PATB1018:石头剪刀布

PATB1018:石头剪刀布

【思路】:

循环–判断条件满足就 记录

记录: 赢 平 输 ;

运用Hash映射求出赢得次数最多的手势 :实质是求出最大值得索引映射

【知识点】

求出一个数组的最大值得索引映射

char ykn[3] = { 'B', 'C', 'J' }; 
int max0 = 0;
for (int i = 0; i < 3; i++)
{
    if (YIN0[max0]<YIN0[i])
    {
        max0 = i;//最大值得索引
    }   
}

注意点:输入cin 后面之后还有cin字符串的话需要 用cin.get()来接受 本题没有涉及到,但是用了之后会更加安全 。

for (int i = 0; i < n; i++){
    getchar();
    cin >> Game[0];
    cin.get();
    cin >> Game[1];

【参考答案1】

#include <cstdio>
#include <iostream>//cpp
#include <cstring>
#include <string>  //Cpp
#include <algorithm>

using namespace std;
//====================================PATB1018=====================
//PATB1018 按照题意进行模拟,锤子剪刀布

void CJB(){
    char Game[3] = {};
    int yin[2] = { 0 };
    int shu[2] = { 0 };
    int pin = 0;
    int n;

    int YIN1[3] = { 0 }; // YIN[0]==B赢 YIN[3]得到数组 B C J分别赢得次数 然后求出最大值的 索引  其实可以考虑写一个changed函数了
    int YIN0[3] = { 0 };

    scanf("%d", &n);
    for (int i = 0; i < n; i++){
        getchar();
        cin >> Game[0];
        cin.get();
        cin >> Game[1];
        if (Game[0] == Game[1]){
            pin++;
        }
        else{
            if (Game[0] == 'B'){
                if (Game[1] == 'C'){
                    yin[0]++;
                    YIN0[0]++;//B
                    shu[1]++;


                }
                else if (Game[1] == 'J'){
                    shu[0]++;
                    yin[1]++;
                    YIN1[2]++;//J
                }
            }
            else if (Game[0] == 'C'){
                if (Game[1] == 'B'){
                    shu[0]++;
                    yin[1]++;
                    YIN1[0]++;//B
                }
                else if (Game[1] == 'J'){
                    yin[0]++;
                    YIN0[1]++;//C
                    shu[1]++;
                }
            }
            else if (Game[0] =='J'){
                if (Game[1] == 'C'){
                    shu[0]++;
                    yin[1]++;
                    YIN1[1]++;//B
                }
                else if (Game[1] == 'B'){
                    yin[0]++;
                    YIN0[2]++;//C
                    shu[1]++;
                }
            }
        }
    }


    cout<<yin[0] << " "<<pin << " " <<shu[0] << endl;
    cout<<yin[1] << " "<<pin << " " <<shu[1] << endl;

    //下面需要计算赢得最多的手势 也就是求出一个数组的 最值的索引。 这里需要注意如果是
    char ykn[3] = { 'B', 'C', 'J' }; 
    int max0 = 0,max1=0;
    for (int i = 0; i < 3; i++)
    {
        if (YIN0[max0]<YIN0[i])
        {
            max0 = i;//最大值得索引
        }   

        if (YIN1[max1]<YIN1[i])
        {
            max1 = i;//最大值得索引
        }
    }
    cout << ykn[max0] <<" " << ykn[max1];

}
int main(){
    CJB();
    return 0;
}

【参考答案2】

【知识点】

未完 待分析

//====================================PATB1018=====================
//PATB1018 按照题意进行模拟,锤子剪刀布

int change(char c){
    if (c == 'B')return 0;
    if (c == 'C')return 1;
    if (c == 'J')return 2;
}

void BCJ1018(){
    int n;
    scanf_s("%d", &n);
    char c1, c2;//输入字符串
    int k1, k2;//转换后的两个选手的号码便于计算

    int time_A[3] = { 0 };//记录第一位的输 平 赢 
    int hands_A[3] = { 0 };//记录出什么 赢 平 输的次数
    int hands_B[3] = { 0 };
    for (int i = 0; i < n; i++){
        getchar();
        scanf_s("%c %c", &c1, &c2);
        k1 = change(c1);
        k2 = change(c2);
        if ((k1+1)%3==k2){
            time_A[0]++;//甲赢
            hands_A[k1]++;//甲靠的是k1赢

        }else if (k1==k2){
            time_A[1]++;
        }
        else if ((k2 + 1) % 3 == k1){
            time_A[2]++;//甲输
            hands_B[k2]++;//乙靠的是k2赢
        }
    }
    printf("%d %d %d\n", time_A[0], time_A[1], time_A[2]);
    printf("%d %d %d\n", time_A[2], time_A[1], time_A[0]);

    //以上完成的是计算甲乙的胜负次数;下面计算最大值的索引

    char ykn[3] = { 'B', 'C', 'J' };
    int maxyk1=0, maxsk2=0;

    for (int i = 0; i < 3; i++){
        if (hands_A[maxyk1] < hands_A[i]){
            maxyk1 = i;//为赢得最多的  索引
        }
        if (hands_B[maxsk2] < hands_B[i]){
            maxsk2 = i;
        }
    }
    printf("%c %c", ykn[maxyk1], ykn[maxsk2]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值