ZOJ 1111 Poker Hands【模拟】

题目链接

题意:有点像德州扑克……什么同花,顺子,对牌,高牌什么的……问两方谁赢,或者是平手。

大大大大大模拟……慢慢写……写了好久

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

// 1.High Card
// 2.Pair
// 3.Two Pairs
// 4.Three of a Kind
// 5.Straight
// 6.Flush
// 7.Full House
// 8.Four of a kind
// 9.Straight flush

struct Node
{
    char v;
    char s;
};

struct Person
{
    Node node[7];
    int level;
    int judge_value;
    int judge_value_2;
    int judge_value_3;
    int judge_value_4;
    int judge_value_5;
};

Person black, white;
char input[30];

bool cmp(Node a, Node b)
{
    return a.v < b.v;
}

bool cmp2(Node a, Node b)
{
    return a.v > b.v;
}

int getsamev(Person tt) // how many same value or suit
{
    int cnt[150];
    memset(cnt, 0, sizeof(cnt));
    // 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A
    for (int i = 1; i <= 5; i++)    cnt[tt.node[i].v]++;
    int ans = 1;
    for (int i = 0; i < 150; i++)   ans = max(ans, cnt[i]);
    return ans;
}

int getsames(Person tt)
{
    int cnt[10];
    memset(cnt, 0, sizeof(cnt));
    // 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A
    for (int i = 1; i <= 5; i++)    cnt[tt.node[i].s]++;
    int ans = 1;
    for (int i = 0; i < 10; i++)   ans = max(ans, cnt[i]);
    return ans;
}

bool isconv(Person tt, int start, int end) // judge if tt[start] to tt[end] is consecutive
{
    for (int i = end; i >= start + 1; i--)
    {
        if (tt.node[i].v - tt.node[i - 1].v != 1)
            return false;
    }
    return true;
}

void change(char &a)
{
    if (a == 'T') a = '9' + 1;
    else if (a == 'J')    a = '9' + 2;
    else if (a == 'Q')    a = '9' + 3;
    else if (a == 'K')    a = '9' + 4;
    else if (a == 'A')    a = '9' + 5;
    else if (a == 'C')  a = 1;
    else if (a == 'D')  a = 2;
    else if (a == 'H')  a = 3;
    else if (a == 'S')  a = 4;
}

void getlevel(Person &tt)
{
    // 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A

    for (int i = 1; i <= 5; i++)  change(tt.node[i].v), change(tt.node[i].s);
    sort(tt.node + 1, tt.node + 6, cmp);
    int same_suit_num = getsames(tt); // number of same suit is same_suit_num
    int same_value_num = getsamev(tt); // number of same value is same_value_num
    tt.judge_value = tt.judge_value_2 = tt.judge_value_3 = tt.judge_value_4 = 0;

// 9.Straight flush
// 5 cards of the same suit with consecutive values.
// Ranked by the highest card in the hand.
    if (same_suit_num == 5)
    {
        if (isconv(tt, 1, 5))
        {
            tt.judge_value = tt.node[5].v; // the highest card in the hand
            tt.level = 9;
            return;
        }
    }

// 8.Four of a kind
// 4 cards with the same value.
// Ranked by the value of the 4 cards.
    if (same_value_num == 4)
    {
        if (tt.node[1].v == tt.node[2].v)   tt.judge_value = tt.node[1].v;
        else if (tt.node[2].v == tt.node[3].v)  tt.judge_value = tt.node[2].v;
        else if (tt.node[3].v == tt.node[4].v)  tt.judge_value = tt.node[3].v;
        tt.level = 8;
        return;
    }

// 7.Full House
// 3 cards of the same value, with the remaining 2 cards forming a pair.
// Ranked by the value of the 3 cards.
    if (same_value_num == 3)
    {
        char tmp = '-';
        char tmp2 = '-';
        int cnt[150];
        memset(cnt, 0, sizeof(cnt));
        for (int i = 1; i <= 5; i++)  cnt[tt.node[i].v]++;
        for (int i = 0; i < 150; i++)
        {
            if (cnt[i] == 3)    tmp = (char)i;
            else if (cnt[i] == 2)   tmp2 = (char)i;
        }
        if (tmp != '-' && tmp2 != '-')
        {
            tt.level = 7;
            tt.judge_value = tmp;
            return;
        }
    }

// 6.Flush
// Hand contains 5 cards of the same suit.
// Hands which are both flushes are ranked using the rules for High Card.
    if (same_suit_num == 5)
    {
        tt.judge_value = tt.node[5].v;
        tt.judge_value_2 = tt.node[4].v;
        tt.judge_value_3 = tt.node[3].v;
        tt.judge_value_4 = tt.node[2].v;
        tt.judge_value_5 = tt.node[1].v;
        tt.level = 6;
        return;
    }

// 5.Straight
// Hand contains 5 cards with consecutive values.
// Hands which both contain a straight are ranked by their highest card.
    if (isconv(tt, 1, 5))
    {
        tt.level = 5;
        tt.judge_value = tt.node[5].v;
        return;
    }

// 4.Three of a Kind
// Three of the cards in the hand have the same value.
// Hands which both contain three of a kind are ranked by the value of the 3 cards.
    if (same_value_num == 3)
    {
        tt.level = 4;
        int cnt[150];
        memset(cnt, 0, sizeof(cnt));
        for (int i = 1; i <= 5; i++)  cnt[tt.node[i].v]++;
        for (int i = 0; i < 150; i++)
        {
            if (cnt[i] == 3)
            {
                tt.judge_value = i;
                break;
            }
        }
        return;
    }

// 3.Two Pairs
// The hand contains 2 different pairs.
// Hands which both contain 2 pairs are ranked by the value of their highest
// pair.
// Hands with the same highest pair are ranked by the value of their other pair.
// If these values are the same the hands are ranked by the value of the remaining card.
    if (same_value_num == 2)
    {
        int cnt[150];
        memset(cnt, 0, sizeof(cnt));
        char tmp = '-';
        char tmp2 = '-';
        char tmp3 = '-';

        for (int i = 1; i <= 5; i++)  cnt[tt.node[i].v]++;
        for (int i = 0; i < 150; i++)
        {
            if (cnt[i] == 2)
            {
                if (tmp == '-')   tmp = i;
                else tmp2 = i;
            }
            if (cnt[i] == 1)
                tmp3 = i;
        }
        if (tmp != '-' && tmp2 != '-' && tmp3 != '-')
        {
            tt.judge_value = tmp > tmp2 ? tmp : tmp2;
            tt.judge_value_2 = tmp < tmp2 ? tmp : tmp2;
            tt.judge_value_3 = tmp3;
            tt.level = 3;
            return;
        }
    }

// 2.Pair
// 2 of the 5 cards in the hand have the same value.
// Hands which both contain a pair are ranked by the value of the cards forming the pair.
// If these values are the same, the hands are ranked by the values of the cards not forming the pair, in decreasing order.
    if (same_value_num == 2)
    {
        int cnt[150];
        memset(cnt, 0, sizeof(cnt));
        char tmp[5];
        int tot = 0;
        for (int i = 1; i <= 5; i++)  cnt[tt.node[i].v]++;
        for (int i = 0; i < 150; i++)
        {
            if (cnt[i] == 2)
                tt.judge_value = i;
            else if (cnt[i] == 1)
                tmp[tot++] = i;
        }
        tt.judge_value_2 = tmp[2];
        tt.judge_value_3 = tmp[1];
        tt.judge_value_4 = tmp[0];
        tt.level = 2;
        return;
    }

    tt.level = 1;
    tt.judge_value = tt.node[5].v;
    tt.judge_value_2 = tt.node[4].v;
    tt.judge_value_3 = tt.node[3].v;
    tt.judge_value_4 = tt.node[2].v;
    tt.judge_value_5 = tt.node[1].v;
    return;
}

int main()
{
    while (gets(input))
    {
        for (int i = 1; i <= 5; i++)
        {
            black.node[i].v = input[(i - 1) * 3];
            black.node[i].s = input[(i - 1) * 3 + 1];
            white.node[i].v = input[(i + 4) * 3];
            white.node[i].s = input[(i + 4) * 3 + 1];
        }
        getlevel(black);
        getlevel(white);
        if (black.level > white.level)    printf("Black wins.\n");
        else if (black.level < white.level)   printf("White wins.\n");
        else
        {
            if (black.level == 2)
            {
                if (black.judge_value != white.judge_value)
                {
                    if (black.judge_value > white.judge_value)    printf("Black wins.\n");
                    if (black.judge_value < white.judge_value)    printf("White wins.\n");
                }
                else
                {
                    if (black.judge_value_2 != white.judge_value_2)
                    {
                        if (black.judge_value_2 > white.judge_value_2)  printf("Black wins.\n");
                        if (black.judge_value_2 < white.judge_value_2)  printf("White wins.\n");
                    }
                    else
                    {
                        if (black.judge_value_3 != white.judge_value_3)
                        {
                            if (black.judge_value_3 > white.judge_value_3)  printf("Black wins.\n");
                            if (black.judge_value_3 < white.judge_value_3)  printf("White wins.\n");
                        }
                        else
                        {
                            // compare 4
                            if (black.judge_value_4 > white.judge_value_4)    printf("Black wins.\n");
                            if (black.judge_value_4 < white.judge_value_4)    printf("White wins.\n");
                            if (black.judge_value_4 == white.judge_value_4)   printf("Tie.\n");
                        }
                    }
                }
            }
            else if (black.level == 3)
            {
                if (black.judge_value != white.judge_value)
                {
                    if (black.judge_value > white.judge_value)    printf("Black wins.\n");
                    if (black.judge_value < white.judge_value)    printf("White wins.\n");
                }
                else
                {
                    if (black.judge_value_2 != white.judge_value_2)
                    {
                        if (black.judge_value_2 > white.judge_value_2)  printf("Black wins.\n");
                        if (black.judge_value_2 < white.judge_value_2)  printf("White wins.\n");
                    }
                    else
                    {
                        if (black.judge_value_3 > white.judge_value_3)  printf("Black wins.\n");
                        if (black.judge_value_3 < white.judge_value_3)  printf("White wins.\n");
                        if (black.judge_value_3 == white.judge_value_3)   printf("Tie.\n");
                    }
                }
            }
            else if (black.level == 1 || black.level == 6)
            {
                if (black.judge_value != white.judge_value)
                {
                    if (black.judge_value > white.judge_value)    printf("Black wins.\n");
                    if (black.judge_value < white.judge_value)    printf("White wins.\n");
                }
                else
                {
                    if (black.judge_value_2 != white.judge_value_2)
                    {
                        if (black.judge_value_2 > white.judge_value_2)  printf("Black wins.\n");
                        if (black.judge_value_2 < white.judge_value_2)  printf("White wins.\n");
                    }
                    else
                    {
                        if (black.judge_value_3 != white.judge_value_3)
                        {
                            if (black.judge_value_3 > white.judge_value_3)  printf("Black wins.\n");
                            if (black.judge_value_3 < white.judge_value_3)  printf("White wins.\n");
                        }
                        else
                        {
                            if (black.judge_value_4 != white.judge_value_4)
                            {
                                if (black.judge_value_4 > white.judge_value_4)    printf("Black wins.\n");
                                if (black.judge_value_4 < white.judge_value_4)    printf("White wins.\n");
                            }
                            else
                            {
                                if (black.judge_value_5 > white.judge_value_5)    printf("Black wins.\n");
                                if (black.judge_value_5 < white.judge_value_5)    printf("White wins.\n");
                                if (black.judge_value_5 == white.judge_value_5)   printf("Tie.\n");
                            }
                        }
                    }
                }
            }
            else
            {
                if (black.judge_value > white.judge_value)    printf("Black wins.\n");
                if (black.judge_value < white.judge_value)    printf("White wins.\n");
                if (black.judge_value == white.judge_value)   printf("Tie.\n");
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值