/* Name: 08_石头剪刀布 Author: 巧若拙 Description: 08_石头剪刀布 描述 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”, 就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多? 输入 输入包含三行。 第一行包含三个整数:N,NA,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 提示 对于测试数据,猜拳过程为: 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赢的轮数多。 算法分析:第一步把数据整理成长度均为n的数组; 第二步比较数组元素,有两种方法,一是直接利用逻辑表达式判断胜负, 二是设置一个关系数组,根据数组元素和下标的关系判断胜负。 其中第二种方法颇为巧妙。 */ #include<iostream> #include<cstdio> using namespace std; const int M = 100; int main( ) { int n, na, nb, sA = 0, sB = 0; int libA[M] = {0}; int libB[M] = {0}; cin >> n >> na >> nb; //读入数据 for (int i=0; i<na; i++) { cin >> libA[i]; } for (int i=0; i<nb; i++) { cin >> libB[i]; } //整理数据 for (int j=0, i=na; i<n; i++,j++) { libA[i] = libA[j]; } for (int j=0, i=nb; i<n; i++,j++) { libB[i] = libB[j]; } //方法1:利用逻辑表达式 // for (int i=0; i<n; i++) // { // if ((libA[i] == 0 && libB[i] == 2) || (libA[i] == 2 && libB[i] == 5) || (libA[i] == 5 && libB[i] == 0)) //A赢 // sA++; // else if ((libB[i] == 0 && libA[i] == 2) || (libB[i] == 2 && libA[i] == 5) || (libB[i] == 5 && libA[i] == 0)) //B赢 // sB++; // } //方法2:利用关系数组 int T[6] = {0}; T[0] = 5, T[2] = 0, T[5] = 2; //T[i]是i的天敌 for (int i=0; i<n; i++) { if (libA[i] == T[libB[i]]) //A赢 sA++; else if (libB[i] == T[libA[i]]) //B赢 sB++; } (sA > sB) ? cout << "A" : (sA < sB) ? cout << "B" : cout << "draw"; return 0; }
08_石头剪刀布
最新推荐文章于 2024-03-28 19:55:32 发布