本文主要是介绍(乙)1018 锤子剪刀布 (20 分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C
代表“锤子”、J
代表“剪刀”、B
代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
题意:
给你一个N ,后面有N组游戏的手势,让你分别求出来这两个人胜,平,负各有多少局,然后再计算出这两个人用什么手势赢的局数最多;注意输出格式;
思路:
就是一道简单的模拟题,最近脑袋有点混沌,代码写完后自己定睛一看,什么东西,看不懂;什么思路,不知道;数组存什么东西,不清楚。。。。。。。
把每一种情况都模拟一下,用数组记录结果,一定要细心,不然容易把自己绕进去。。。。。泪目。。。。
只需要计算出来一个人的胜,平,负,另一个人和他相反;
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;struct node
{char x;char y;
} a[101000];int n;
int q[4];//记录第一个人胜利的情况;q[1],q[2],q[3]分别代表用锤子,剪刀,布赢的次数;
int p[4];//记录第二个人胜利的情况;p[1],p[2],p[3]分别代表用锤子,剪刀,布赢的次数;
int s[4];//记录第一个人的胜,平,负局的情况;s[1],s[2],s[3]分别代表胜,平,负局;void solve1()//查找第一个人胜的次数最多的手势;
{ //注意题目的要求:如果解不唯一,则输出按字母序最小的解。int flag=3,maxx=q[3];//所以要优先搜索布,锤子,剪刀;if(q[1]>maxx){maxx=q[1];flag=1;}if(q[2]>maxx){maxx=q[2];flag=2;}if(flag==1)printf("C ");else if(flag==2)printf("J ");else if(flag==3)printf("B ");return ;
}void solve2()//查找第二个人胜利次数最多的手势;同上;
{int flag=3,maxx=p[3];if(p[1]>maxx){maxx=p[1];flag=1;}if(p[2]>maxx){maxx=p[2];flag=2;}if(flag==1)printf("C\n");else if(flag==2)printf("J\n");else if(flag==3)printf("B\n");return ;
}int main()
{while(~scanf("%d",&n)){memset(q,0,sizeof q);memset(p,0,sizeof p);memset(s,0,sizeof s);for(int i=0; i<n; i++){getchar();//记得吸收字符;scanf("%c %c",&a[i].x,&a[i].y);if(a[i].x=='C'){if(a[i].y=='C')s[2]++;//平局;else if(a[i].y=='J'){s[1]++;//赢局;q[1]++;//记录下第一个人用什么手势赢;}else if(a[i].y=='B'){s[3]++;//输局;}}else if(a[i].x=='J'){if(a[i].y=='J')s[2]++;//平局;else if(a[i].y=='B'){s[1]++;//赢局;q[2]++;//记录下用什么手势赢;}else if(a[i].y=='C'){s[3]++;//输局;}}else if(a[i].x=='B'){if(a[i].y=='B')s[2]++;//平局;else if(a[i].y=='C'){s[1]++;//赢局;q[3]++;//记录下用什么手势赢;}else if(a[i].y=='J'){s[3]++;//输局;}}//因为赢,平,输局都是两个人相对的,就不用判断第二个人的情况了;if(a[i].y=='C')//直接判断第二个人用什么手势赢的局数多就可以了;{if(a[i].x=='J')p[1]++;}else if(a[i].y=='J'){if(a[i].x=='B'){p[2]++;}}else if(a[i].y=='B'){if(a[i].x=='C'){p[3]++;}}}for(int i=1; i<=2; i++)//注意输出格式;printf("%d ",s[i]);printf("%d\n",s[3]);for(int i=3; i>=2; i--)printf("%d ",s[i]);printf("%d\n",s[1]);solve1();solve2();}return 0;
}
这篇关于(乙)1018 锤子剪刀布 (20 分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!