Sure! Here's the updated code:

#include<iostream>
#include<cstdio>
#include<cstring>
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;

// Function to convert card number to integer value
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;    
    }
}

// Function to check if there exists a valid set of cards B
inline bool judgeCards() {
    if (m == 1) {
        // Single card case
        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) {
        // Pair case
        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]) {
        // Flush case
        for (int i = 1; i <= n; i++) {
            if (CardsNumsFromF[i + m - 1] == '2' || i + m - 1 > n) {
                // Cannot form a flush
                break;
            }
            int j;
            for (j = i + 1; j <= m + i - 1; j++) {
                if (NumsFromF[j - 1] + 1 != NumsFromF[j] || WordsFromF[j - 1] != WordsFromF[j]) break;
            }
            if (j == m + i) {
                if (NumsFromF[m + i + 1] > NumsFromC[m + i + 1]) {
                    for (int k = m; k >= 1; k--) {
                        cout << WordsFromF[j - k] << CardsNumsFromF[j - k] << " ";
                    }
                    return true;
                }
            }
        }
        return false;
    } else if (m >= 5 && !IsSameColor && !IsSameNum) {
        // Straight case
        for (int i = 1; i <= n; i++) {
            if (CardsNumsFromF[i + m - 1] == '2' || i + m - 1 > n) {
                // Cannot form a straight
                break;
            }
            int j;
            for (j = i + 1; j <= m + i - 1; j++) {
                if (NumsFromF[j - 1] + 1 != NumsFromF[j]) break;
            }
            if (j == m + i) {
                if (NumsFromF[j - m + 1] > NumsFromC[1]) {
                    for (int k = m; k >= 1; k--) {
                        cout << WordsFromF[j - k + 1] << CardsNumsFromF[j - k + 1] << " ";
                    }
                    return true;
                }
            }
        }
        return false;
    } else if (m == 4 && !IsSameNum && CardsNumsFromC[1] == CardsNumsFromC[2] && CardsNumsFromC[m - 1] != CardsNumsFromC[m]) {
        // Three of a kind case
        if (n == 3) {
            return false;
        }
        for (int i = 1; i <= n; i++) {
            int j;
            for (j = i + 1; j <= m + i; j++) {
                if (j != m - 1) {
                    if (NumsFromF[j - 1] == NumsFromF[j]) continue;
                    else break;
                } else {
                    if (NumsFromF[j] > NumsFromC[2]) {
                        for (int k = m; k >= 1; k--) {
                            cout << WordsFromF[j - k + 1] << CardsNumsFromF[j - k + 1] << " ";
                        }
                        return true;
                    } else {
                        break;
                    }
                }
            }
        }
        return false;
    }
    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;
        }
    }
    bool found = false;
    for (int i = NumsFromC[m] + 1; i <= 15; i++) {
        if (m == 1) {
            for (int j = 1; j <= n; j++) {
                if (NumsFromF[j] == i) {
                    cout << WordsFromF[j] << CardsNumsFromF[j];
                    found = true;
                    break;
                }
            }
        } else if (m == 2 && IsSameNum) {
            for (int j = 1; j <= n - 1; j++) {
                if (NumsFromF[j] == i && NumsFromF[j + 1] == i) {
                    cout << WordsFromF[j] << CardsNumsFromF[j] << " ";
                    cout << WordsFromF[j + 1] << CardsNumsFromF[j + 1];
                    found = true;
                    break;
                }
            }
        } else if (m >= 3 && IsSameColor && !IsSameNum && CardsNumsFromC[1] != CardsNumsFromC[2]) {
            for (int j = 1; j <= n - m + 1; j++) {
                bool valid = true;
                for (int k = 0; k < m; k++) {
                    if (NumsFromF[j + k] != i + k || WordsFromF[j + k] != WordsFromF[j]) {
                        valid = false;
                        break;
                    }
                }
                if (valid) {
                    for (int k = 0; k < m; k++) {
                        cout << WordsFromF[j + k] << CardsNumsFromF[j + k] << " ";
                    }
                    found = true;
                    break;
                }
            }
        } else if (m >= 5 && !IsSameColor && !IsSameNum) {
            for (int j = 1; j <= n - m + 1; j++) {
                bool valid = true;
                for (int k = 0; k < m; k++) {
                    if (NumsFromF[j + k] != i + k) {
                        valid = false;
                        break;
                    }
                }
                if (valid) {
                    for (int k = 0; k < m; k++) {
                        cout << WordsFromF[j + k] << CardsNumsFromF[j + k] << " ";
                    }
                    found = true;
                    break;
                }
            }
        }
        if (found) break;
    }
    if (!found) {
        cout << "-1";
    }

    return 0;
}

I have made the following changes to the code:

  1. Fixed the logic for checking the straight and flush cases.
  2. Added a loop to find a valid set of cards B with a higher point value than cards A.
  3. Added a flag to indicate if a valid set of cards B is found.
  4. Handled the case when no valid set of cards B is found and output -1.

Please let me know if you have any further questions or concerns!

C++ Poker Game: Find a Winning Hand Algorithm and Code

原文地址: http://www.cveoy.top/t/topic/bd9j 著作权归作者所有。请勿转载和采集!

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