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;
}
可以看出,方法二比方法一简洁了很多。