PATDay3
B1018锤子剪刀布
题目分析
1、将字母转化为数字进行比较,这里按照字典序刚好可以实现
2、注意字符输入scanf会吸收回车,因此可以在每一次循环的scanf前加一个getchar()将回车吸收掉。否则格式错误
3、这里需要分析共九种胜负情况,实际上是成对出现,甲输乙赢。因此主要判断三种情况,甲胜== 乙败 ,平 , 甲败 ==乙胜。
4、最后还需要统计三种胜利的最大那个,考虑字典序,可以用一个数组来存储三种手势胜利的次数,然后返回最大的。同等情况返回字典序小的。
AC代码
#include<cstdio>
using namespace std;
int convert(char a)
{
if(a=='B') return 1;
if(a=='C') return 2;
if(a=='J') return 3;
}
char max_ges(int a[],int n)
{
int temp=0;
for(int i=1;i<n;i++)
{
temp=a[temp]>=a[i]?temp:i;
}
if(temp==0) return 'B';
if(temp==1) return 'C';
if(temp==2) return 'J';
}
int main()
{
int A[3]={0};
int B[3]={0};
int A_win[3]={0};
int B_win[3]={0};
int N;
scanf("%d",&N);
while(N--)
{
char a1,a2;
int b1,b2;
getchar();
scanf("%c %c",&a1,&a2);
b1=convert(a1);
b2=convert(a2);
if((b1+1)%3==b2||b1+1==b2)
{
A[0]++;
B[2]++;
A_win[b1-1]++;
}
else if(b1==b2)
{
A[1]++;
B[1]++;
}
else
{
A[2]++;
B[0]++;
B_win[b2-1]++;
}
}
char c1,c2;
c1=max_ges(A_win,3);
c2=max_ges(B_win,3);
printf("%d %d %d\n",A[0],A[1],A[2]);
printf("%d %d %d\n",B[0],B[1],B[2]);
printf("%c %c",c1,c2);
}
写的不是特别好,优化的点:
1、考虑将字符转化为数字时下标为0,1,2可以减少一个比较判断条件