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;
}
版权声明:本文标题:OpenJudge NOI 1.16 08:石头剪刀布 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728851069a1176685.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论