PAT 乙级 1018 锤子剪刀布 (20 分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

FigCJB.jpg

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数 N(≤10​5​​),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

5 3 2
2 3 5
B B

这道题的注意点在注释里了。三种情况(布锤剪刀)用三个数字0,1,2表示是本题要注意的点,可以省下许多不必要的if代码。同时,

	int a[3]={0},b[3]={0};//记录甲乙出布、剪刀、锤子赢的数量 

也值得记住。在这种记录某种情况出现的次数的情况下,数组有一定优势(出t1(假如为0,B,布)赢的话,就在a[t1]上+1)

#include<iostream>
using namespace std;

int change(char x){
	if(x=='B') return 0;
	if(x=='C') return 1;
	if(x=='J') return 2;
	else return -1;
}
char rechange(int x){
	if(x==0) return 'B';
	if(x==1) return 'C';
	if(x==2) return 'J';
	else return 'e';
}
int main(){
	int n,i;
	char x,y;
	int t1,t2,max1,max2,f1,f2;
	int aWinCnt,bWinCnt,abEqualCnt;
	int a[3]={0},b[3]={0};//记录甲乙出布、剪刀、锤子赢的数量 
	cin>>n;
	aWinCnt = 0;
	bWinCnt = 0;
	abEqualCnt = 0;
	max1 = -1;
	f1 = -1;
	max2 = -1;
	f2 = -1;
	while(n--){
		cin>>x>>y;
		t1 = change(x);
		t2 = change(y);
		if((t1+1)%3==t2){//找规律…这个方法应该可以用在许多地方,有数种情况的时候都可以用。(类似剪刀石头布的) 
			aWinCnt++;
			a[t1]++;
		}
		else if((t2+1)%3==t1){
			bWinCnt++;
			b[t2]++;
		}
		else{
			abEqualCnt++;
		}
	}
    cout<<aWinCnt<<" "<<abEqualCnt<<" "<<bWinCnt<<endl;
    cout<<bWinCnt<<" "<<abEqualCnt<<" "<<aWinCnt<<endl;
    for(i=0;i<3;i++){
    	if(max1<a[i]){
    		f1 = i;
    		max1 = a[i];
		}
		if(max2<b[i]){
			f2 = i;
			max2 = b[i];
		}
	}
	//cout<<f1<<" "<<f2<<endl;
	cout<<rechange(f1)<<" "<<rechange(f2)<<endl;
	
} 

猜你喜欢

转载自blog.csdn.net/zjy997/article/details/94473463