扑克牌游戏 - 寻找点数大于对手的牌
#include
const int MAXN = 25;
int n, m; char WordsFromF[MAXN]; char CardsNumsFromF[MAXN]; int NumsFromF[MAXN]; char WordsFromC[MAXN]; char CardsNumsFromC[MAXN]; int NumsFromC[MAXN]; bool IsSameColor = true; bool IsSameNum = true;
inline void checkCard(int Num, int i, int Nums[]) {
if (Num >= '3' && Num <= '9') Nums[i] = Num - '0';
else {
if (Num == 'X') Nums[i] = 10;
else if (Num == 'J') Nums[i] = 11;
else if (Num == 'Q') Nums[i] = 12;
else if (Num == 'K') Nums[i] = 13;
else if (Num == 'A') Nums[i] = 14;
else if (Num == '2') Nums[i] = 15;
}
}
inline bool judgeCards() { if (m == 1) { // 单张情况 for (int i = 1; i <= n; i++) { if (NumsFromF[i] > NumsFromC[1]) { cout << WordsFromF[i] << CardsNumsFromF[i]; return true; } } return false; } else if (m == 2 && IsSameNum) { // 对子情况 for (int i = 1; i <= n; i++) { if (NumsFromF[i] > NumsFromC[1] && NumsFromF[i + 1] == NumsFromF[i]) { cout << WordsFromF[i] << CardsNumsFromF[i] << " "; cout << WordsFromF[i + 1] << CardsNumsFromF[i + 1]; return true; } } return false; } else if (m >= 3 && IsSameColor && !IsSameNum && CardsNumsFromC[1] != CardsNumsFromC[2]) { // 大于等于三张,花色相同,大小不同,前两张大小不同(防止三带一) // 同花顺情况 for (int i = 1; i <= n - m + 1; i++) { bool valid = true; for (int k = 0; k < m; k++) { if (NumsFromF[i + k] != NumsFromC[1] + k || WordsFromF[i + k] != WordsFromC[1]) { valid = false; break; } } if (valid) { for (int k = 0; k < m; k++) { cout << WordsFromF[i + k] << CardsNumsFromF[i + k] << " "; } return true; } } return false; } else if (m >= 5 && !IsSameColor && !IsSameNum) { // 大于等于五张,花色不同,大小不同(大于等于五张不会出现三带一) // 普通顺子情况 for (int i = 1; i <= n - m + 1; i++) { bool valid = true; for (int k = 0; k < m; k++) { if (NumsFromF[i + k] != NumsFromC[1] + k) { valid = false; break; } } if (valid) { for (int k = 0; k < m; k++) { cout << WordsFromF[i + k] << CardsNumsFromF[i + k] << " "; } return true; } } return false; } else if (m == 4 && !IsSameNum && CardsNumsFromC[1] == CardsNumsFromC[2] && CardsNumsFromC[m - 1] != CardsNumsFromC[m]) { // 若有四张牌,且数字有不同,且前两张一样,后两张不同 // 三带一情况 for (int i = 1; i <= n - m + 1; i++) { bool valid = true; for (int k = 0; k < m - 1; k++) { if (NumsFromF[i + k] != NumsFromC[1] + k || WordsFromF[i + k] != WordsFromC[1]) { valid = false; break; } } if (valid) { for (int k = 0; k < m - 1; k++) { cout << WordsFromF[i + k] << CardsNumsFromF[i + k] << " "; } for (int k = 0; k < 2; k++) { cout << WordsFromF[i] << CardsNumsFromF[i] << " "; } return true; } } return false; } // ERROR但是骗分 return false; }
int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> WordsFromF[i] >> CardsNumsFromF[i];
checkCard(CardsNumsFromF[i], i, NumsFromF);
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> WordsFromC[i] >> CardsNumsFromC[i];
checkCard(CardsNumsFromC[i], i, NumsFromC);
if (i != 1) {
if (WordsFromC[i] != WordsFromC[i - 1]) IsSameColor = false;
if (CardsNumsFromC[i] != CardsNumsFromC[i - 1]) IsSameNum = false;
}
}
if (!judgeCards()) {
cout << "-1";
}
return 0;
原文地址: http://www.cveoy.top/t/topic/bd3R 著作权归作者所有。请勿转载和采集!