OpenJudge NOI 1.16 08:石头剪刀布

【题目链接】

OpenJudge NOI 1.16 08:石头剪刀布

【题目考点】

1. 数组
2. 循环遍历数组

循环遍历下标为0~n-1的数组时,取下一个下标的方法为:
i = (i+1)%n;
循环遍历下标为1~n的数组,取下一个下标的方法:
i = i+1 > n ? i+1-n : i+1;

【解题思路】

用a,b两个数组保存两人的出拳规律,循环n次,循环遍历a、b两个数组,取出两个数值,按石头剪刀布的规则判定a、b的胜负,做计数。最后根据计数输出结果。

【题解代码】

解法1:数组下标为0~n-1
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n, na, nb, a[105], b[105], awin = 0, bwin = 0;//awin:a赢的次数 bwin:b赢的次数 
    cin >> n >> na >> nb;
    for(int i = 0; i < na; ++i)
        cin >> a[i];
    for(int i = 0; i < nb; ++i)
        cin >> b[i];
    int ia = 0, ib = 0;//ia:a当前出拳序号 ib:b当前出拳序号
    for(int i = 0; i < n; ++i)
    {
        int ca = a[ia], cb = b[ib];//当前a、b的出拳
        if (ca != cb)
        {
            if(ca == 0 && cb == 2 || ca == 2 && cb == 5 || ca == 5 && cb == 0)//如果a赢过b 
                awin++;
            else//如果b赢过a 
                bwin++;
        }
        ia = (ia + 1) % na;
        ib = (ib + 1) % nb;
    }
    if (awin > bwin)
        cout << 'A' << endl;
    else if (bwin > awin)
        cout << 'B' << endl;
    else
        cout << "draw" << endl;
    return 0;
}
解法2:数组下标为1~n
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n, na, nb, a[105], b[105], awin = 0, bwin = 0;//awin:a赢的次数 bwin:b赢的次数 
    cin >> n >> na >> nb;
    for(int i = 1; i <= na; ++i)
        cin >> a[i];
    for(int i = 1; i <= nb; ++i)
        cin >> b[i];
    int ia = 1, ib = 1;//ia:a当前出拳序号 ib:b当前出拳序号
    for(int i = 1; i <= n; ++i)
    {
        int ca = a[ia], cb = b[ib];//当前a、b的出拳
        if (ca != cb)
        {
            if(ca == 0 && cb == 2 || ca == 2 && cb == 5 || ca == 5 && cb == 0)//如果a赢过b 
                awin++;
            else//如果b赢过a 
                bwin++;
        }
        ia = ia + 1 > na ? ia + 1 - na : ia + 1;//循环遍历数组 下标变化 
        ib = ib + 1 > nb ? ib + 1 - nb : ib + 1;
    }
    if (awin > bwin)
        cout << 'A' << endl;
    else if (bwin > awin)
        cout << 'B' << endl;
    else
        cout << "draw" << endl;
    return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值