PAT B1018 锤子剪刀布

题目描述


分析:

步骤一:考虑到最后需要输出字母序的解,可将三种手势先将字母序排序,即 B B B(布), C C C(锤), J J J(剪)。可以发现这个顺序又是环环相克的。即 B B B C C C C C C J J J J J J B B B,不妨将 B B B C C C J J J 转换为 0 , 1 , 2 0,1,2 012

步骤二:对每组读入的甲乙手势 c 1 , c 2 c1,c2 c1c2,先转换为数字 k 1 , k 2 k1,k2 k1k2,然后判断该局输赢。由于设置的顺序恰好就是环环相克的顺序,因此 k 1 k1 k1 k 2 k2 k2 的条件是 ( k 1 + 1 ) (k1 + 1) % 3 = k2 (k1+1) k 1 k1 k1 k 2 k2 k2 的条件是 k 1 = k 2 k1 = k2 k1=k2 k 1 k1 k1 k 2 k2 k2 的条件是 ( k 2 + 1 ) (k2 + 1) % 3 = k1 (k2+1)

在得到该局的输赢后,对甲乙的胜、平、负情况进行更新,并对赢得该局的一方的手势次数进行更新。

步骤三:比较得到胜利次数最多的手势,将 0 , 1 , 2 0,1,2 012 转换为 B , C , J B,C,J BCJ 输出。

本题需要开两组数组,一组(timesa[],timesb[])记录甲乙的胜、平、负的情况,并且要记得甲赢一次,即乙要输一次。另一组(hansa[],handsb[])记录甲乙用布、剪、锤赢的次数。

最后输出的时候要枚举一下 timesa 和 timesb 的情况。从handsa,handsb中找出最大值,转换为相应字符。


代码(C++)

#include <iostream>

using namespace std;

// timesa和timesb的0, 1, 2 分别是甲乙胜,平,负的次数
// handsa和handsb的0,1,2分别是甲乙用步,锤,剪胜的次数 
int timesa[3], timesb[3];
int handsa[3], handsb[3];

int change(char c) // 将招数转换为数字
{
    if (c == 'B') return 0;
    if (c == 'C') return 1;
    if (c == 'J') return 2;
}

char dechange(int c) // 输出赢得最多的招数时要按字符输出因此再转换回去
{
    if (c == 0) return 'B';
    if (c == 1) return 'C';
    if (c == 2) return 'J';
}

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++)
    {
        char ca, cb; // 甲乙出的“招数”
        cin >> ca >> cb;
        
        int ka, kb;
        ka = change(ca);
        kb = change(cb);

        if ((ka + 1) % 3 == kb) { // 甲胜
            timesa[0] ++;
            timesb[2] ++;
            handsa[ka] ++;
        } else if (ka == kb) { // 平局
            timesa[1] ++;
            timesb[1] ++;
        } else if ((kb + 1) % 3 == ka){ // 乙胜
            timesa[2] ++;
            timesb[0] ++;
            handsb[kb] ++;
        }
    }
    
    cout << timesa[0] << ' ' << timesa[1] << ' ' << timesa[2] << endl;
    cout << timesb[0] << ' ' << timesb[1] << ' ' << timesb[2] << endl;
    
    int ida = 0, idb = 0; // 存储甲乙赢的最多的招数
    for (int i = 0; i < 3; i ++)
    {
        if (handsa[i] > handsa[ida]) ida = i;
        if (handsb[i] > handsb[idb]) idb = i;
    }
    
    cout << dechange(ida) << ' ' << dechange(idb) << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值