View Code of Problem 21

#include <iostream>
#include <cstring>
using namespace std;

int card_to_int(char c) {
    switch (c) {
        case '3': return 13;
        case '4': return 14;
        case '5': return 15;
        case '6': return 16;
        case '7': return 17;
        case '8': return 18;
        case '9': return 19;
        case 'T': return 20;
        case 'J': return 21;
        case 'Q': return 22;
        case 'K': return 23;
        case 'A': return 24;
        case '2': return 25;
        case 'X': return 26;
        case 'Y': return 27;
        default: return -1;
    }
}

bool cmp(int a[], int b[], int n, int m) {
    if (n == 0) {
        return true;
    } else if (m == 0) {
        return false;
    }

    // 单张牌
    if (n == 1 && m == 1) {
        return a[0] > b[0];
    }

    // 对子
    if (n == 2 && m == 2) {
        if (a[0] == a[1] && b[0] == b[1]) {
            return a[0] > b[0];
        } else {
            return a[1] > b[1];
        }
    }

    // 三张牌
    if (n == 3 && m == 3) {
        if (a[0] == a[1] && a[1] == a[2] && b[0] == b[1] && b[1] == b[2]) {
            return a[0] > b[0];
        } else {
            return a[2] > b[2];
        }
    }

    // 炸弹
    if (n == 4 && m == 4) {
        if (a[0] == a[1] && a[1] == a[2] && a[2] == a[3] && b[0] == b[1] && b[1] == b[2] && b[2] == b[3]) {
            return a[0] > b[0];
        } else {
            return a[3] > b[3];
        }
    }

    // 其他情况,无法比较
    return false;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        char a[20], b[20];
        cin >> a >> b;
        int n = strlen(a);
        int m = strlen(b);
        int cards_a[10], cards_b[10];
        memset(cards_a, 0, sizeof(cards_a));
        memset(cards_b, 0, sizeof(cards_b));

        // 统计JLH的手牌中每种牌的出现次数
        for (int i = 0; i < n; i += 2) {
            int card = card_to_int(a[i]);
            cards_a[card - 3]++;
        }

        // 统计下家的手牌中每种牌的出现次数
        for (int i = 0; i < m; i += 2) {
            int card = card_to_int(b[i]);
            cards_b[card - 3]++;
        }

        bool flag = false;
        for (int i = 4; i <= 27; i++) {
            if (cmp(cards_a, cards_b, i, i)) {
                flag = true;
                break;
            }
        }

        if (flag) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
    return 0;
}

Double click to view unformatted code.


Back to problem 21