代码:(方法打表)
#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;
}```