B1018 锤子剪刀布 20分
题目描述:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d7094b66cadad864acec79d8b6242ddc.png#pic_center)
思路①:
模拟,使用大量的if else语句一一判断,考虑到最后需要输出字典序最小的解,不妨先将三种手势按字典序排序。
代码描述:
#include<iostream>
#include<cstdio>
using namespace std;
char m[3]={'B','C','J'};
int main()
{
int n,a1=0,b1=0,c1=0,a2=0,b2=0;
int aa[3]={0},bb[3]={0};
char aaa,bbb;
char a,b;
cin>>n;
while(n--){
cin>>a>>b;
if(a==b) c1++;
else if(a=='B'&&b=='C'||a=='C'&&b=='J'||a=='J'&&b=='B') {
a1++,b2++;
if(a=='B') aa[0]++;
if(a=='C') aa[1]++;
if(a=='J') aa[2]++;
}
else {
b1++,a2++;
if(b=='B') bb[0]++;
if(b=='C') bb[1]++;
if(b=='J') bb[2]++;
}
}
aaa='B',bbb='B';
int ma=aa[0],mb=bb[0];
for(int i=1;i<3;i++){
if(aa[i]>ma) {
ma=aa[i];
aaa=m[i];
}
if(bb[i]>mb) {
mb=bb[i];
bbb=m[i];
}
}
printf("%d %d %d\n",a1,c1,a2);
printf("%d %d %d\n",b1,c1,b2);
printf("%c %c\n",aaa,bbb);
return 0;
}
思路②:
从思路①的代码上看,代码杂乱,思路难以理清。如果考虑将字母转换为数字的思路,则会清晰简单很多。将三种手势按字典序排序,可以发现B胜C、C胜J、J胜B。将B、C、J转化为0,1,2,并用k1、k2来存储。可以发现若(k1+1)%3==k2则k1赢,若k1等于k2,则平局,若(k2+1)%3等于k1,则k1输。
代码描述:
#include<iostream>
#include<cstdio>
using namespace std;
int n,time_a[3],time_b[3],hand_a[3],hand_b[3];
char m[3]={'B','C','J'};
int exchange(char a)
{
if(a=='B') return 0;
if(a=='C') return 1;
return 2;
}
int main()
{
cin>>n;
char a,b;
while(n--){
cin>>a>>b;
int k1=exchange(a);
int k2=exchange(b);
if((k1+1)%3==k2){
time_a[0]++;
time_b[2]++;
hand_a[k1]++;
}
else if(k1==k2){
time_a[1]++;
time_b[1]++;
}
else{
time_a[2]++;
time_b[0]++;
hand_b[k2]++;
}
}
printf("%d %d %d\n",time_a[0],time_a[1],time_a[2]);
printf("%d %d %d\n",time_b[0],time_b[1],time_b[2]);
int id1=0,id2=0;
for(int i=0;i<3;i++){
if(hand_a[i]>hand_a[id1]) id1=i;
if(hand_b[i]>hand_b[id2]) id2=i;
}
printf("%c %c\n",m[id1],m[id2]);
return 0;
}