当前位置: 代码迷 >> 综合 >> PAT (Basic Level) Practice (中文) B1018. 锤子剪刀布
  详细解决方案

PAT (Basic Level) Practice (中文) B1018. 锤子剪刀布

热度:84   发布时间:2023-11-22 06:50:41.0

题目描述

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式

输入第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

个人代码:

#include<bits/stdc++.h>
using namespace std;
int change(char c)
{
    if(c=='B')return 0;if(c=='C')return 1;if(c=='J')return 2;
}
int main()
{
    int n,k1,k2;char c1,c2;int a[20]={
    0};int b[20]={
    0};int awin[10]={
    0};int bwin[10]={
    0}; scanf("%d",&n);getchar();for(int i=1;i<=n;i++){
    scanf("%c %c",&c1,&c2);getchar();k1=change(c1);k2=change(c2);if((k1+1)%3==k2){
    a[0]++;b[2]++;awin[k1]++;}if(k1==k2){
    a[1]++;b[1]++;}if((k2+1)%3==k1){
    b[0]++;a[2]++;bwin[k2]++;}}printf("%d %d %d\n",a[0],a[1],a[2]);printf("%d %d %d\n",b[0],b[1],b[2]);int cwin=0;int dwin=0;int w1,w2;char mp[3]={
    'B','C','J'};for(int i=0;i<3;i++){
    if(awin[i]>awin[cwin]){
    cwin=i;}if(bwin[i]>bwin[dwin]){
    dwin=i;}}printf("%c %c",mp[cwin],mp[dwin]);} 

分析:

输出要求是要输出甲乙两个人的胜负平局情况,所以先设定两个数组a[20],b[20]存储胜负平情况,a[0]表示胜利,a[1]表示平局,a[2]表示失败,如果甲胜利的话,就是a[0]++b[2]++,如果甲乙平局的话,就是a[1]++,b[1]++;如果乙胜利的话,b[2]++,a[0]++;其中a[0]表示的是胜利,a[1]表示的是平局,a[2]表示的是失败,每读入一组数据,就将数组信息变更,对于找胜率最高的情况,可以设置数组awin[]和bwin[],a[0]表示的是B获胜的情况,a[1]表示的是C获胜的情况,a[2]表示的是J获胜的情况,之后比较三个数组的值就好,为了方便一点,可以另外设置一个数组mp,用来存放B C J,方便输出结果。

注意:

数组有点多,有点乱,需要自己好好琢磨一下。
第一次测试点三没有通过,原因是找最大的情况的时候算法有点错误。已更正。
在这里插入图片描述

  相关解决方案