admin管理员组

文章数量:1621657

【题目链接】

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;
}

本文标签: 剪刀石头noiOpenJudge