Fork me on GitHub

ZOJ 1111 Poker Hands --复杂模拟

昨天晚上写的,写了一个多小时,9000+B,居然1A了,爽。

题意:玩扑克,比大小。规则如下:

题意很简单,看过赌神的人都知道,每人手中5张排,比牌面大小,牌面由大到小分别是(这里花色无大小),级别从高到低依次为:
1.同花顺:牌面一样,只比较最大的看谁大,一样大则平手
2.四条:四个一样的,看这四个一样的中谁大谁赢
3.葫芦:三条+一对,看三条中谁的牌面大
4.同花:都是同花就按从大到小比较,看谁的更大
5.顺子:都是顺子看最大的谁大,一样则平手
6.三条:三条看三条中谁的牌面大
7.两对: 两对就看谁的对子大,都一样大比单牌
8.一对: 比对子,一样则比单牌
9.单排:按顺序比较大小,大者胜

 

知道规则了就搞就行了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 100007

struct node
{
    int num,suit;
}a[7],b[7];
int BigstPair[2],SecondPair[2],Remain[2];  //7
int k[6][2];  //4
int m[5][2];  //8

int cmp(node ka,node kb)
{
    return ka.num < kb.num;
}

pair<int,int> solve(node a[],int tag)
{
    int i,j;
    sort(a,a+5,cmp);
    int level = 9;
    int val = 0;
    int flag = 0;
    for(i=1;i<5;i++)
    {
        if(a[i].suit != a[i-1].suit)
            break;
    }
    if(i == 5)
    {
        for(j=1;j<5;j++)
        {
            if(a[j].num != a[j-1].num+1)
                break;
        }
        if(j == 5)
            return make_pair(level,a[4].num);
    }
    //2
    level--;
    if((a[0].num == a[1].num && a[1].num == a[2].num && a[2].num == a[3].num)||(a[1].num == a[2].num && a[2].num == a[3].num && a[3].num == a[4].num))
    {
        if(a[3].num == a[4].num)
            return make_pair(level,a[4].num);
        else if(a[0].num == a[1].num)
            return make_pair(level,a[0].num);
    }
    //3
    level--;
    if(a[0].num == a[1].num && a[2].num == a[3].num && a[3].num == a[4].num)
        return make_pair(level,a[4].num);
    if(a[0].num == a[1].num && a[1].num == a[2].num && a[3].num == a[4].num)
        return make_pair(level,a[0].num);
    //4
    level--;
    if(a[0].suit == a[1].suit && a[1].suit == a[2].suit && a[2].suit == a[3].suit && a[3].suit == a[4].suit)
    {
        k[1][tag] = a[0].num;
        k[2][tag] = a[1].num;
        k[3][tag] = a[2].num;
        k[4][tag] = a[3].num;
        k[5][tag] = a[4].num;
        return make_pair(level,a[4].num);
    }
    //5
    level--;
    for(i=1;i<5;i++)
    {
        if(a[i].num != a[i-1].num+1)
            break;
    }
    if(i == 5)
        return make_pair(level,a[4].num);
    //6
    level--;
    int cnt = 1;
    for(i=4;i>=0;i--)
    {
        if(a[i].num == a[i+1].num)
        {
            cnt++;
            if(cnt >= 3)
                return make_pair(level,a[i].num);
        }
        else
            cnt = 1;
    }
    //7
    level--;
    if(a[0].num == a[1].num && a[3].num == a[4].num)
    {
        BigstPair[tag] = a[3].num;
        SecondPair[tag] = a[1].num;
        Remain[tag] = a[2].num;
        return make_pair(level,BigstPair[tag]);
    }
    if(a[0].num == a[1].num && a[2].num == a[3].num)
    {
        BigstPair[tag] = a[3].num;
        SecondPair[tag] = a[1].num;
        Remain[tag] = a[4].num;
        return make_pair(level,BigstPair[tag]);
    }
    if(a[1].num == a[2].num && a[3].num == a[4].num)
    {
        BigstPair[tag] = a[3].num;
        SecondPair[tag] = a[1].num;
        Remain[tag] = a[0].num;
        return make_pair(level,BigstPair[tag]);
    }
    //8
    level--;
    if(a[3].num == a[4].num)
    {
        m[1][tag] = a[0].num;
        m[2][tag] = a[1].num;
        m[3][tag] = a[2].num;
        m[4][tag] = a[3].num;
        return make_pair(level,m[4][tag]);
    }
    if(a[2].num == a[3].num)
    {
        m[1][tag] = a[0].num;
        m[2][tag] = a[1].num;
        m[3][tag] = a[4].num;
        m[4][tag] = a[3].num;
        return make_pair(level,m[4][tag]);
    }
    if(a[1].num == a[2].num)
    {
        m[1][tag] = a[0].num;
        m[2][tag] = a[3].num;
        m[3][tag] = a[4].num;
        m[4][tag] = a[2].num;
        return make_pair(level,m[4][tag]);
    }
    if(a[0].num == a[1].num)
    {
        m[1][tag] = a[2].num;
        m[2][tag] = a[3].num;
        m[3][tag] = a[4].num;
        m[4][tag] = a[0].num;
        return make_pair(level,m[4][tag]);
    }
    //9 High Cards
    level--;
    k[1][tag] = a[0].num;
    k[2][tag] = a[1].num;
    k[3][tag] = a[2].num;
    k[4][tag] = a[3].num;
    k[5][tag] = a[4].num;
    return make_pair(level,k[5][tag]);
}

int compare(pair<int,int> ka,pair<int,int> kb)
{
    if(ka.first == kb.first)
    {
        if(ka.first == 6 || ka.first == 1)  //flush or high card
        {
            if(k[5][0] == k[5][1])
            {
                if(k[4][0] == k[4][1])
                {
                    if(k[3][0] == k[3][1])
                    {
                        if(k[2][0] == k[2][1])
                        {
                            if(k[1][0] == k[1][1])
                                return 0;
                            else if(k[1][0] > k[1][1])
                                return 1;
                            else
                                return -1;
                        }
                        else if(k[2][0] > k[2][1])
                            return 1;
                        else
                            return -1;
                    }
                    else if(k[3][0] > k[3][1])
                        return 1;
                    else
                        return -1;
                }
                else if(k[4][0] > k[4][1])
                    return 1;
                else
                    return -1;
            }
            else if(k[5][0] > k[5][1])
                return 1;
            else
                return -1;
        }
        else if(ka.first == 3)  //two pair
        {
            if(BigstPair[0] == BigstPair[1])
            {
                if(SecondPair[0] == SecondPair[1])
                {
                    if(Remain[0] == Remain[1])
                        return 0;
                    else if(Remain[0] > Remain[1])
                        return 1;
                    else
                        return -1;
                }
                else if(SecondPair[0] > SecondPair[1])
                    return 1;
                else
                    return -1;
            }
            else if(BigstPair[0] > BigstPair[1])
                return 1;
            else
                return -1;
        }
        else if(ka.first == 2)  //pair
        {
            if(m[4][0] == m[4][1])
            {
                if(m[3][0] == m[3][1])
                {
                    if(m[2][0] == m[2][1])
                    {
                        if(m[1][0] == m[1][1])
                            return 0;
                        else if(m[1][0] > m[1][1])
                            return 1;
                        else
                            return -1;
                    }
                    else if(m[2][0] > m[2][1])
                        return 1;
                    else
                        return -1;
                }
                else if(m[3][0] > m[3][1])
                    return 1;
                else
                    return -1;
            }
            else if(m[4][0] > m[4][1])
                return 1;
            else
                return -1;
        }
        else
        {
            if(ka.second == kb.second)
                return 0;
            else if(ka.second > kb.second)
                return 1;
            else
                return 0;
        }
    }
    else
    {
        if(ka.first > kb.first)
            return 1;
        else if(ka.first < kb.first)
            return -1;
    }
}

int main()
{
    int i,j;
    char ss[12][3];
    while(scanf("%s",ss[0])!=EOF)
    {
        for(i=1;i<10;i++)
            scanf("%s",ss[i]);
        for(i=0;i<5;i++)
        {
            char pre = ss[i][0];
            char back = ss[i][1];
            if(pre >= '2' && pre <= '9')
                a[i].num = pre-'0';
            else if(pre == 'T')
                a[i].num = 10;
            else if(pre == 'J')
                a[i].num = 11;
            else if(pre == 'Q')
                a[i].num = 12;
            else if(pre == 'K')
                a[i].num = 13;
            else if(pre == 'A')
                a[i].num = 14;
            // 0:C  1:D  2:H  3:S
            if(back == 'C')
                a[i].suit = 0;
            else if(back == 'D')
                a[i].suit = 1;
            else if(back == 'H')
                a[i].suit = 2;
            else
                a[i].suit = 3;
        }
        for(i=5;i<10;i++)
        {
            char pre = ss[i][0];
            char back = ss[i][1];
            if(pre >= '2' && pre <= '9')
                b[i-5].num = pre-'0';
            else if(pre == 'T')
                b[i-5].num = 10;
            else if(pre == 'J')
                b[i-5].num = 11;
            else if(pre == 'Q')
                b[i-5].num = 12;
            else if(pre == 'K')
                b[i-5].num = 13;
            else if(pre == 'A')
                b[i-5].num = 14;
            // 0:C  1:D  2:H  3:S
            if(back == 'C')
                b[i-5].suit = 0;
            else if(back == 'D')
                b[i-5].suit = 1;
            else if(back == 'H')
                b[i-5].suit = 2;
            else
                b[i-5].suit = 3;
        }
        int res = compare(solve(a,0),solve(b,1));
        if(res > 0)
            puts("Black wins.");
        else if(res == 0)
            puts("Tie.");
        else
            puts("White wins.");
    }
    return 0;
}
View Code

 

posted @ 2014-08-07 11:10  whatbeg  阅读(405)  评论(0编辑  收藏  举报