1. 程式人生 > >1018 錘子剪刀布——C/C++實現

1018 錘子剪刀布——C/C++實現

題目

1018 錘子剪刀布 (20 point(s))

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:

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

演算法

 

程式碼

#include <stdio.h>
 
void fact ( int a[] );
int main(void) {
	int N, draw, win1, win2;
	char c1, c2;
    /*a1[0]甲錘子贏的次數,a1[1]甲剪刀贏的次數,a1[2]甲布贏的次數*/
    /*a2[0]乙錘子贏的次數,a2[1]乙剪刀贏的次數,a2[2]乙布贏的次數*/
	int a1[3] = {0}, a2[3] = {0};
	
	draw = 0;    //平局次數。
	scanf("%d", &N);
	getchar();
	while ( N-- ) {
		scanf("%c %c", &c1, &c2);
		getchar();    //只要是迴圈中的scanf(),就需要用getchar()來消除回車。
		if ( c1 == c2 )	draw++;    //手勢相同,平局+1.
		else if ( c1 == 'C' && c2 == 'J' )	a1[0]++;
		else if ( c1 == 'J' && c2 == 'B' )	a1[1]++;
		else if ( c1 == 'B' && c2 == 'C' )	a1[2]++;
		else if ( c2 == 'C' && c1 == 'J' )	a2[0]++;
		else if ( c2 == 'J' && c1 == 'B' )	a2[1]++;
		else if ( c2 == 'B' && c1 == 'C' )	a2[2]++;
	}
	win1 = a1[0]+a1[1]+a1[2];    //甲贏的總次數。
	win2 = a2[0]+a2[1]+a2[2];    //乙贏的總次數。
	printf("%d %d %d\n", win1, draw, win2);    //甲贏就是乙輸,反之則反。
	printf("%d %d %d\n", win2, draw, win1);
	fact( a1 );
	printf(" ");
	fact( a2 );
	
	return 0;
}
/*統計獲勝次數最多手勢的函式*/
void fact ( int a[] ) {
    /*ch[0]、ch[1]、ch[2]分別對映三種手勢*/
	char ch[3] = { 'C', 'J', 'B' };    
	int i, max = 0;
	for ( i = 0; i < 3; i++ ) {
		if ( a[i] > a[max] )	max = i;    //找出勝利次數最多的手勢。
		if ( a[i] == a[max] && ch[i] < ch[max] )	max = i;    //找出字母最小的。
	}
	printf("%c", ch[max]);
}