总时间限制: 1000ms 内存限制: 65536kB
描述
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期的。请问,小A和小B比了N轮之后,谁赢了?
输入
输入的第一行包含一个整数K(0 < K < 100),表示K组测试数据。
之后的每组测试数据包含三行。第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。其中,0表示“石头”,2表示“剪刀”,5表示“布”。
输出
对于每组测试数据,输出一行。如果小A赢了,输出A;如果小B赢了,输出B;如果两人打平,输出draw。
样例输入
2
10 3 4
0 2 5
0 5 0 2
5 3 3
2 0 5
0 2 5
样例输出
A
draw
提示
对于第一组测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
所以A赢了4轮,B赢了2轮,双方打平4轮,所以A赢了。
对于第二组测试数据,猜拳过程为:
A:2 0 5 2 0
B:0 2 5 0 2
所以A赢了2轮,B赢了2轮,双方打平1轮,所以最终打平了。
解析:
水题一道,没有什么算法的涉及。思路为:申请两个空间大小为N的数组,循环放置A的出拳及B的出拳。定义判断输赢的函数,判断两个数组的对应数据的输赢,统计最后A的输赢次数即可。附代码如下(菜鸟一枚,ACM大牛轻喷):
#include <iostream> #include <math.h> using namespace std; bool win(int i,int j) { if(i==0 && j==2) return true; if(i==0 && j==5) return false; if(i==2 && j==0) return false; if(i==5 && j==0) return true; if(i==2 && j==5) return true; if(i==5 && j==2) return false; return false; } int main() { int times; cin>>times; while(times--) { int n; cin>>n; int na; cin>>na; int nb; cin>>nb; int *a = new int[na]; int *b = new int[nb]; int i,j,k; for(i=0; i<na;i++) cin>>a[i]; for(i=0; i<nb; i++) cin>>b[i]; int ta[10000]; int tb[10000]; for(i=0;i<n;i++) { ta[i]= a[i%na]; tb[i]= b[i%nb]; } int numa=0; int numb=0; for(i=0;i<n;i++) { if(ta[i]==tb[i]) continue; else if(win(ta[i],tb[i])) numa++; else numb++; } if(numa==numb) cout<<"draw"<<endl; else if(numa>numb) cout<<"A"<<endl; else cout<<"B"<<endl; } return 0; }