1. 程式人生 > >PAT——乙級1018

PAT——乙級1018

題目是

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

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

FigCJB.jpg

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。

輸入格式:

輸入第 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

 這道題很好理解,但有有點複雜。

主要處理好B J C與數字之間的轉換就好。

我寫的程式碼是

 1 #include<cstdio>
 2
int VS(char A, char B) 3 { 4 if (A == B) return 0; 5 else if (A == 'C'&&B == 'J'|| A == 'J'&&B == 'B'|| A == 'B'&&B == 'C') return 1; 6 else return -1; 7 } 8 int CharToNum(char temp) 9 { 10 if (temp == 'B') return 0; 11 else if (temp == 'C') return 1;
12 else return 2; 13 } 14 char NumToChar(int temp) 15 { 16 if (temp == 0) return 'B'; 17 else if (temp == 1) return 'C'; 18 else return 'J'; 19 } 20 int main() 21 { 22 int n, A[3] = { 0,0,0 }, B[3] = {0,0,0}, A_win[3]= { 0,0,0 }, B_win[3]= { 0,0,0 }, temp; 23 scanf("%d", &n); 24 char A_value, B_value; 25 26 for(int i=0;i<n;i++) 27 { 28 getchar();//清除快取區的\n換行 29 scanf("%c %c", &A_value, &B_value); 30 temp = VS(A_value, B_value); 31 if (temp == 0) { A[1]++;B[1]++; } 32 else if (temp == 1) 33 { 34 A[0]++;B[2]++; 35 A_win[CharToNum(A_value)]++; 36 } 37 else 38 { 39 A[2]++;B[0]++; 40 B_win[CharToNum(B_value)]++; 41 } 42 } 43 printf("%d %d %d\n", A[0], A[1], A[2]); 44 printf("%d %d %d\n", B[0], B[1], B[2]); 45 int Amax=0, Bmax=0,A_index,B_index; 46 for (int i = 0;i < 3;i++) 47 { 48 if (A_win[i] > Amax) { Amax = A_win[i];A_index = i; } 49 if (B_win[i] > Bmax){Bmax = B_win[i];B_index = i;} 50 } 51 printf("%c %c", NumToChar(A_index), NumToChar(B_index)); 52 return 0; 53 }

主要注意一定

第28行,一定要清空資料快取區,因為還有一個回車符

我就栽在這個上面了,看了答案才明白。

 

教材上的答案是先都把BJC轉換為數字,然後根據數字去比較大小,而我是新建了一個函式,直接比較字元。還是教材的簡單。