石头剪刀布

石头剪刀布

题目描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头 - 布 - 石头 - 剪刀 - 石头 - 布 - 石头 - 剪刀……”,就是以 “石头 - 布 - 石头 - 剪刀” 为周期不断循环的。请问,小A和小B 比了N轮之后,谁赢的轮数多?

输入格式

输入包含三行。

第一行包含三个整数:NNA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0<N,NA,NB<100。

第二行包含NA个整数,表示小A出拳的规律。

第三行包含NB个整数,表示小B出拳的规律。

其中,0 表示 “石头”,2表示 “剪刀”,5表示 “布”。相邻两个整数之间用单个空格隔开。

输出格式

输出一行,如果小A赢的轮数多,输出  A ;如果小B赢的轮数多,输出 B ;如果两人打平,输出  draw 。


样例输入

10 3 4
0 2 5
0 5 0 2

样例输出

A 

说明/提示

对于测试数据,猜拳过程为:

A0 2 5 0 2 5 0 2 5 0
B0 5 0 2 0 5 0 2 0 5

A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多。


解法一

  直接模拟出拳周期耶( •̀ ω •́ )y,在来几个笨笨的if判断,最后比较一下谁赢得多就AC啦!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[105],b[105];
 4 int main ()
 5 {
 6     int n,na,nb,wa=0,wb=0;
 7     cin>>n>>na>>nb;
 8     for(int i=0;i<na;i++)
 9     {
10         cin>>a[i];
11     }
12     for(int i=0;i<nb;i++)
13     {
14         cin>>b[i];
15     }
16     
17     int ta=0,tb=0;
18     for(int i=0;i<n;i++)
19     {
20         if(ta==na)
21         {
22             ta=0;
23         }
24         if(tb==nb)
25         {
26             tb=0;
27         }
28         if(a[ta]==0 && b[tb]==2) wa++;
29         if(a[ta]==2 && b[tb]==0) wb++;
30         if(a[ta]==0 && b[tb]==5) wb++;
31         if(a[ta]==5 && b[tb]==0) wa++;
32         if(a[ta]==2 && b[tb]==5) wa++;
33         if(a[ta]==5 && b[tb]==2) wb++;
34         ta++;
35         tb++;
36     }
37     
38     if(wa>wb)
39     {
40         cout<<"A";
41     }
42     else if(wa<wb)
43     {
44         cout<<"B";
45     }
46     else
47     {
48         cout<<"draw";
49     }
50         
51     return 0;
52 }

  解释一下变量(数组)都啥意思:

  • n:表示比赛了轮
  • na:表示小A的出拳周期长度
  • nb:表示小B的出拳周期长度
  • a[105]:记录小A的出拳周期
  • b[105]:记录小B的出拳周期
  • wa:表示小A的胜利次数
  • wb:表示小B的胜利次数
  • ta:用于指向小A周期中的出拳内容
  • tb:用于指向小B周期中的出拳内容

  之前楼楼还加上了一句 if(a[ta]==b[tb]) continue; ,可以让时间复杂度降低一定程度,但是千万注意,加上此条代码时,务必要先让ta和tb两个变量+1,否则就可能变成每次都直接continue。

 

posted @ 2020-08-29 11:24  DYXM  阅读(890)  评论(0编辑  收藏  举报