【题目链接】
【题目考点】
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;
}