1018 錘子剪刀布 (20分)
題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344
大家應該都會玩“錘子剪刀布”的游戲:兩人同時給出手勢,剪刀勝布,布勝錘子,錘子勝剪刀,相同平局,現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,并且給出雙方分別出什么手勢的勝算最大,
輸入格式:
輸入第 1 行給出正整數 N(≤100000),即雙方交鋒的次數,隨后 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 <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這種回傳值的寫法,可以使用三目運算子進行簡寫,可能效率也會高一點吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102309.html
標籤:其他
上一篇:母牛
下一篇:selenium
