PAT B1018 锤子剪刀布 mw的解题思路与优化方案

也是codeup上面题目编号6172的问题 I: 锤子剪刀布

文章目录

    • 题目
    • 解题思路
    • 总体代码

题目

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,规则就不在这放了。现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入
输入第1行给出正整数N(<= 1 0 5 10^5 105),即双方交锋的次数。随后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

解题思路

题目本身没什么另外的含义,总体难度来说也不是很难。就是可能判断步骤会有点多。我选择的是甲乙各建立一个长度为3的数组存放胜、负、平的次数,在另外建立两个长度为3的数组存放各个手势赢得次数。

接下来就是冗长的判断步骤,对结果进行输出即可。

我觉得全篇唯一难的点就是在题目输出中写的“如果解不唯一,则输出按字母序最小的解。”这里了。为此我在存储胜利手势的数组中是按字母序进行存放的,也就是[0]存放的‘B’,[1]存放的是‘C’,[2]存放的是‘J’。判断时遇到胜利次数相等的数时直接continue就好了。

具体看代码,不难理解。

总体代码

#include
int n;
int main(){
     
	scanf("%d",&n);
	getchar();
	int a[3]={
     0},b[3]={
     0},c[3]={
     0},d[3]={
     0};
	char x,y;
	for(int i=0;i<n;i++){
     
		scanf("%c %c",&x,&y);
		getchar();
		if(x=='C'){
     
			if(y=='C'){
     
				a[1]++;
				b[1]++;
			}
			if(y=='J'){
     
				a[0]++;
				b[2]++;
				c[1]++;
			}
			if(y=='B'){
     
				a[2]++;
				b[0]++;
				d[0]++;
			}
		}
		if(x=='B'){
     
			if(y=='C'){
     
				a[0]++;
				b[2]++;
				c[0]++;
			}
			if(y=='J'){
     
				a[2]++;
				b[0]++;
				d[2]++;
			}
			if(y=='B'){
     
				a[1]++;
				b[1]++;
			}
		}
		if(x=='J'){
     
			if(y=='C'){
     
				a[2]++;
				b[0]++;
				d[1]++;
			}
			if(y=='J'){
     
				a[1]++;
				b[1]++;
			}
			if(y=='B'){
     
				a[0]++;
				b[2]++;
				c[2]++;
			}
		}
	}
	int max1=c[0],max2=d[0];
	int u=0,v=0;
	for(int i=0;i<3;i++){
     
		printf("%d",a[i]);
		if(i<2){
     
			printf(" ");
		}
		else printf("\n");
		if(i>0&&max1==c[i]){
     
			continue;
		}
		else if(max1<c[i]){
     
			max1=c[i];
			u=i;
		}	
	}
	for(int i=0;i<3;i++){
     
		printf("%d",b[i]);
		if(i<2){
     
			printf(" ");
		}
		else printf("\n");
		if(i>0&&max2==c[i]){
     
			continue;
		}
		else if(max2<d[i]){
     
			max2=d[i];
			v=i;
		}
	}
	if(u==0){
     
		printf("B ");
	}
	else if(u==1){
     
		printf("C ");
	}
	else if(u==2){
     
		printf("J ");
	}
	if(v==0){
     
		printf("B\n");
	}
	else if(v==1){
     
		printf("C\n");
	}
	else if(v==2){
     
		printf("J\n");
	}
	return 0;
}

这也是我跨年前就开始写一直写到跨年后的程序(简称写了一年),祝各位元旦快乐(* ̄︶ ̄)!

你可能感兴趣的:(mw的刷题之路,c语言)