1018 锤子剪刀布

这篇博客介绍了两种不同的方法实现锤子剪刀布游戏的计分系统。第一种方法使用了大量的ifelse语句,虽然直观但繁琐。第二种方法通过定义手势的字典序和转化函数,简化了代码并提高了效率。最后,博客强调了方法二的简洁性和效率优势。
摘要由CSDN通过智能技术生成

1018 锤子剪刀布 (20 分)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最容易想到的方法是使用大量的if else 语句,列举出所有可能的情况。代码如下

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    int max1,max2;
    char a,b;
    int A1[3]={0},B1[3]={0};//0代表赢,1代表平,2代表输
    int A2[3]={0},B2[3]={0};//0代表布,1代表锤,2代表剪
    scanf("%d",&n);
    for(int i=0 ; i<n ; i++)
    {
        getchar();
        scanf("%c %c",&a,&b);
        if(a=='C'&&b=='J')
        {
            A1[0]++;
            B1[2]++;
            A2[1]++;
        }
        else if(a=='C'&&b=='B')
        {
            A1[2]++;
            B1[0]++;
            B2[0]++;
        }
        else if(a=='J'&&b=='B')
        {
            A1[0]++;
            B1[2]++;
            A2[2]++;
        }
        else if(a=='J'&&b=='C')
        {
            A1[2]++;
            B1[0]++;
            B2[1]++;
        }
        else if(a=='B'&&b=='C')
        {
            A1[0]++;
            B1[2]++;
            A2[0]++;
        }
        else if(a=='B'&&b=='J')
        {
            A1[2]++;
            B1[0]++;
            B2[2]++;
        }
        else
        {
            A1[1]++;
            B1[1]++;
        }
    }
    printf("%d %d %d\n",A1[0],A1[1],A1[2]);
    printf("%d %d %d\n",B1[0],B1[1],B1[2]);
    max1=max(A2[0],max(A2[1],A2[2]));
    max2=max(B2[0],max(B2[1],B2[2]));
    for(int i=0 ; i<3 ; i++)
    {
        if(A2[i]==max1)
        {
            if(i==0)
            {
                printf("B ");
                break;
            }
            else if(i==1){
                printf("C ");
                break;
            }
            else{
                printf("J ");
                break;
            }
        }
    }
    for(int i=0 ; i<3 ; i++)
    {
        if(B2[i]==max2)
        {
            if(i==0){
                printf("B");
                break;
            }
            else if(i==1){
                printf("C");
                break;
            }
            else{
                printf("J");
                break;
            }
        }
    }
}

这种方法虽然思路非常简单,但未免太过繁琐。因此,我们想找到一种较为简单的方法。
由题目可知,我们在最后需要输出字典序最小的解,因此我们可以先把手势按照字典序存放在数组中。我们把这个数组命名为mp,由此可得mp[0]=‘B’,mp[1]=‘C’,mp[2]=‘J’。
我们可以写一个change函数来将对应的手势转化为数字,它的具体实现如下

int change(char c)
{
    if(c=='B')  return 0;
    if(c=='C')  return 1;
    if(c=='J')  return 2;
}

令k1=change(c1)代表A出的手势,k2=change(c2)代表B出的手势,可以看出,当(k1+1)%3=0时,A获胜;当k1=k2时,平局;当(k2+1)%3=0时,B获胜。
还有一点需要注意,在输入n之后需要使用getchar()来吸收空格。
具体的实现方法如下

#include<cstdio>
using namespace std;

int change(char c)
{
    if(c=='B')  return 0;
    if(c=='C')  return 1;
    if(c=='J')  return 2;
}
int main()
{
    char mp[3] = {'B','C','J'};
    int n;
    scanf("%d",&n);
    int a1[3]={0},b1[3]={0};
    int a2[3]={0},b2[3]={0};
    char c1,c2;
    int k1,k2;
    for(int i=0 ; i<n ; i++)
    {
        getchar();  //吸收回车
        scanf("%c %c",&c1,&c2);
        k1 = change(c1);
        k2 = change(c2);
        if((k1 + 1) % 3 == k2)
        {
            a1[0]++;
            b1[2]++;
            a2[k1]++;
        }
        else if(k1 == k2)
        {
            a1[1]++;
            b1[1]++;
        }
        else
        {
            a1[2]++;
            b1[0]++;
            b2[k2]++;
        }
    }
    printf("%d %d %d\n",a1[0],a1[1],a1[2]);
    printf("%d %d %d\n",b1[0],b1[1],b1[2]);
    int id1 = 0 , id2 = 0;
    for(int i=0 ; i<3 ; i++)
    {
        if(a2[i] > a2[id1])
            id1 = i;
        if(b2[i] > b2[id2])
            id2 = i;
    }
    printf("%c %c\n",mp[id1],mp[id2]);
    return 0;
}

可以看出,方法二比方法一简洁了很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值