B1018 锤子剪刀布

在这里插入图片描述
这题一开始没有思路,看了下解析写了一遍,注意点挺多的。
①为了避免过多的if else语句造成繁杂,采用字母转化成数字的方法。这里有一个小的胜平负判断方法需吸收。

②由于scanf使用%c时会将换行符\n读入,需要在相应地方使用getchar吸收空格

③甲乙胜平负次数采用两个数组来记录,同时,甲乙相应的手势胜次也采用两个数组来记录,甲赢乙也要记,乙赢甲也要记,成对出现。

#include<cstdio>
int change(char c){           //B为0,C为1, J为2,恰好是循环相克的顺序,且字典序递增 
	if(c=='B')return 0;
	if(c=='C')return 1;
	if(c=='J')return 2;
}

int main(){
	int N;
	char mp[3]={'B','C','J'};
	scanf("%d",&N);
	int times_A[3]={0},times_B[3]={0};//分别记录甲、乙胜、平、负次数 
	//按BCJ顺序分别记录甲乙3种手势的获胜次数 
	int hand_A[3]={0},hand_B[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){//如果甲赢 
			times_A[0]++;//甲赢次数加一
			times_B[2]++;//乙负次数加一
			hand_A[k1]++;//甲靠k1赢的次数加一
		}else if(k1==k2){//如果平局 
			times_A[1]++;//甲平次数加一
			times_B[1]++;//乙平次数加一
		}else{//如果乙赢 
			times_A[2]++;//甲负次数加一
			times_B[0]++;//乙赢次数加一
			hand_B[k2]++;//乙靠k2赢的次数加一
		}
	}
	
	printf("%d %d %d\n",times_A[0],times_A[1],times_A[2]);
	printf("%d %d %d\n",times_B[0],times_B[1],times_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[id1])id2=i;
	}
	
	printf("%c %c\n",mp[id1],mp[id2]);       //转变回BCJ 
	
	return 0;
}
发布了14 篇原创文章 · 获赞 1 · 访问量 624

猜你喜欢

转载自blog.csdn.net/weixin_42764266/article/details/87295269
今日推荐