1018 錘子剪刀布——C/C++實現
阿新 • • 發佈:2018-12-11
題目
1018 錘子剪刀布 (20 point(s))
大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:
現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。
輸入格式:
輸入第 1 行給出正整數 N(≤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
演算法
程式碼
#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]); }