lg1328 生活大爆炸版石头剪刀布(模拟、打表)

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

代码:(方法打表

#include<stdio.h>
#include<stdlib.h>


int main()
{
    int n,na,nb,i,j;
    int a[203]={0},b[203]={0};
    int flag1[203]={0},flag2[203]={0};
    int counta=0,countb=0,sum=0;
    scanf("%d %d %d",&n,&na,&nb);

    for(i=0;i<na;i++)
    {
        scanf("%d",&flag1[i]);
    }
    for(i=0;i<nb;i++)
    {
        scanf("%d",&flag2[i]);
    }

    for(i=0;i<n;i++)
    {
        a[i]=flag1[i%na];
        b[i]=flag2[i%nb];
    }

    /*for(i=0;i<n;i++)
        printf("%d",a[i]);
    printf("\n");
    for(i=0;i<n;i++)
        printf("%d",b[i]);检验结果*/
    for(i=0,j=0;i<n;i++,j++)
    {
        if((a[i]==0&&b[j]==2)||(a[i]==0&&b[j]==3)||(a[i]==1&&b[j]==0)||(a[i]==1&&b[j]==3)||(a[i]==2&&b[j]==1)||(a[i]==2&&b[j]==4)||(a[i]==3&&b[j]==2)||(a[i]==3&&b[j]==4)||(a[i]==4&&b[j]==0)||(a[i]==4&&b[j]==1))
            counta++;
        else if((b[i]==0&&a[j]==2)||(b[i]==0&&a[j]==3)||(b[i]==1&&a[j]==0)||(b[i]==1&&a[j]==3)||(b[i]==2&&a[j]==1)||(b[i]==2&&a[j]==4)||(b[i]==3&&a[j]==2)||(b[i]==3&&a[j]==4)||(b[i]==4&&a[j]==0)||(b[i]==4&&a[j]==1))
        {
            countb++;
        }
        else
        {
            countb=countb;
            counta=counta;
        }
    }
    printf("%d %d",counta,countb);
    return 0;
}

第一次提交是这样写的:(错了!)

	if((a[i]==0&&(b[j]==2||b[j]==3))||(a[i]==1&&(b[j]==0||b[j]==3))||(a[i]==2&&(b[j]==1||b[j]==4))||a[i]==3&&(b[j]==2||b[j]==4)||(a[i]==4&&(b[j]==0||b[j]==1)))
            counta++;
        else if((b[j]==0&&(a[i]==2||a[j]==3))||(b[j]==1&&(a[i]==0||a[i]==3))||(b[j]==2&&(a[i]==1||a[i]==4))||(b[j]==3&&(a[i]==2||a[i]==4)))
        {
            countb++;
        }
        else
        {
            countb=countb;
            counta=counta;
        }

大佬的方法:(学习!!)
定义一个5*5的二维数组a[5][5],行为5行(第0~4行)表示一个人的出“拳”得分情况,列为另一个人的出“拳”得分情况。数组里的数为1时,表示赢,0为平局或者输
代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 + 10;
int n, na, nb, a[MAXN], b[MAXN], cnta, cntb;
int vs[5][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; //得分表的处理 
int main()
{
    cin >> n >> na >> nb;
    for(int i = 0; i < na; i++) cin >> a[i];
    for(int i = 0; i < nb; i++) cin >> b[i];
    for(int i = 0; i < n; i++)
    {
        cnta += vs[a[i % na]][b[i % nb]]; //周期循环 
        cntb += vs[b[i % nb]][a[i % na]];
    }
    cout << cnta << " " << cntb << endl;
    return 0;
}//真的牛..

大佬的方法2:(学习!!)
也是定义一个二维数组,数组里的数为1时,A赢,0为平局,数为-1时,B赢
这里的打表可以采用第一位大佬那样定义,如下:

int vs[5][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; //得分表的处理 

方法2的代码:

#include<iostream>
using namespace std;
int main()
{
    int score[5][5];
    score[0][0]=0;
    score[0][1]=-1;
    score[0][2]=1;
    score[0][3]=1;
    score[0][4]=-1;
    score[1][0]=1;
    score[1][1]=0;
    score[1][2]=-1;
    score[1][3]=1;
    score[1][4]=-1;
    score[2][0]=-1;
    score[2][1]=1;
    score[2][2]=0;
    score[2][3]=-1;
    score[2][4]=1;
    score[3][0]=-1;
    score[3][1]=-1;
    score[3][2]=1;
    score[3][3]=0;
    score[3][4]=1;
    score[4][0]=1;
    score[4][1]=1;
    score[4][2]=-1;
    score[4][3]=-1;
    score[4][4]=0;
/*到这里都是打表内容;
score[a][b]是表,里面的数字含义与题目相同;
后面(=x)的内容如下:
x=1:小A胜,
x=0:平局,
x=-1:小B胜。*/
    int n,m,k;
    int ans=0;
    int bns=0;
    cin>>n>>m>>k;
    int a[m+1],b[k+1];
    //—————————————
    for(int i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=k;i++)
    {
        cin>>b[i];
    }
//以上是在输入二人的出拳循环
    int anum=1;//小A的出拳指针
    int bnum=1;//小B的出拳指针
    for(int i=1;i<=n;i++)
    {
        if(score[a[anum]][b[bnum]]==1)
        {
            ans++;
        }//小A胜
        else if(score[a[anum]][b[bnum]]==-1)
        {
            bns++;
        }//小B胜
        anum++;//指针右移
        bnum++;//指针右移
        if(anum>m)
        {
            anum=1;
        }//超出循环,从头开始
        if(bnum>k)
        {
            bnum=1;
        }//超出循环,从头开始
    }
    cout<<ans<<" "<<bns;//输出结果
    return 0;
}```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值