PAT B1018 錘子剪刀布 mw的解題思路與優化方案

月白。發表於2021-01-01

也是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<stdio.h>
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;
}

這也是我跨年前就開始寫一直寫到跨年後的程式(簡稱寫了一年),祝各位元旦快樂(* ̄︶ ̄)!

相關文章