題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344ios
你們應該都會玩「錘子剪刀布」的遊戲:兩人同時給出手勢,剪刀勝布,布勝錘子,錘子勝剪刀,相同平局。現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,而且給出雙方分別出什麼手勢的勝算最大。函數
輸入第 1 行給出正整數 N(≤100000),即雙方交鋒的次數。隨後 N 行,每行給出一次交鋒的信息,即甲、乙雙方同時給出的的手勢。C
表明「錘子」、J
表明「剪刀」、B
表明「布」,第 1 個字母表明甲方,第 2 個表明乙方,中間有 1 個空格。spa
輸出第 一、2 行分別給出甲、乙的勝、平、負次數,數字間以 1 個空格分隔。第 3 行給出兩個字母,分別表明甲、乙獲勝次數最多的手勢,中間有 1 個空格。若是解不惟一,則輸出按字母序最小的解。後面那個輸出獲勝最多的手勢我感受邏輯很容易出現遺漏的狀況。code
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 <iostream> using namespace std; // 找到獲勝次數最多的手勢 char findResultGesture(int winGesture[]); int main() { int N = 0; cin >> N; // 甲、乙每次出的手勢 char first = ' '; char second = ' '; // 甲、乙按照B、C、J的順序獲勝的次數 int firstWinGesture[] = {0, 0, 0}; int secondeWinGesture[] = {0, 0, 0}; // 甲的勝,平,負次數 int win = 0, draw = 0, defeat = 0; for (int i = 0; i < N; i++) { cin >> first >> second; // 平局 if (first == second) { draw++; // 甲勝 } else if ((first == 'C' && second == 'J') || (first == 'J' && second == 'B') || (first == 'B' && second == 'C')) { win++; switch (first) { case 'B': firstWinGesture[0]++; break; case 'C': firstWinGesture[1]++; break; case 'J': firstWinGesture[2]++; break; default: break; } // 乙勝 } else { defeat++; switch (second) { case 'B': secondeWinGesture[0]++; break; case 'C': secondeWinGesture[1]++; break; case 'J': secondeWinGesture[2]++; break; default: break; } } } cout << win << " " << draw << " " << defeat << endl; cout << defeat << " " << draw << " " << win << endl; cout << findResultGesture(firstWinGesture) << " " << findResultGesture(secondeWinGesture) << endl; return 0; } char findResultGesture(int winGesture[]) { int a = winGesture[0]; int b = winGesture[1]; int c = winGesture[2]; // 三者均不相等 if (a != b && b != c && a != c) { return a > b ? (a > c ? 'B' : 'J') : (b > c ? 'C' : 'J'); } else { if (a == b && b != c) { return a > c ? 'B' : 'J'; } else if ((b == c && c != a) || (a == c && c != b)) { return a > b ? 'B' : 'C'; // 三者相等 a == b == c } else { return 'B'; } } }
在找到獲勝最多的手勢findResultGesture函數中,遺漏了狀況,在三者均不相等的else裏面,if (a == b),時,有可能出現a == b == c的狀況,此時裏面的if(a > c)將會返回字符J,可是當a == b == c時,應該返回字符‘B'。遊戲
char findResultGesture(int winGesture[]) { int a = winGesture[0]; int b = winGesture[1]; int c = winGesture[2]; // 三者均不相等 if (a != b && b != c && a != c) { if (a > b) { if (a > c) { return 'B'; } else { return 'J'; } } else { if (b > c) { return 'C'; } else { return 'J'; } } } else { if (a == b) { if (a > c) { return 'B'; } else { return 'J'; } } else { if (a > b) { return 'B'; } else { return 'C'; } } } }
還有if() else這種返回值的寫法,可使用三目運算符進行簡寫,可能效率也會高一點吧。ci