#include #include #include using namespace std;

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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录