• [swustoj 1088] 德州扑克


     德州扑克(1088)

    问题描述

    德州扑克是一款风靡全球的扑克游戏。德州扑克一共有52张牌,没有王牌。每个玩家分两张牌作为“底牌”,五张由荷官陆续朝上发出的作为公共牌。开始的时候,每个玩家会有两张面朝下的底牌。经过所有押注圈后,若仍不能分出胜负,游戏会进入“摊牌”阶段,也就是让所剩的玩家亮出各自的底牌以较高下,持大牌者获胜。因技巧性强,易学难精又被称为“扑克游戏中的凯迪拉克”。

         现在有N个玩家进入摊牌阶段(编号为1到N),摊牌阶段比大小的规则是,用自己的2张底牌和5张公共牌结合在一起,选出5张牌,不论手中的牌使用几张(甚至可以不用手中的底牌),凑成最大的成牌,跟其他玩家比大小。比牌先比牌型,大的牌型大于小的牌型,牌型一般分为10种,从大到小为:

        1.皇家同花顺:最高为Ace(一点)的同花顺。

        如A K Q J 10 的同花顺

        2.同花顺:同一花色,顺序的牌。

        如:K Q J 10 9 的同花顺

        3.四条:有四张同一点数的牌。

        如:4 4 4 4 9

        4.葫芦:三张同一点数的牌,加一对其他点数的牌。

        如:3 3 3 10 10

        5.同花:五张同一花色的牌。

        如:J 10 8 7 5 的全是红桃的牌

        6.顺子:五张顺连的牌。

        如:5 4 3 2 A 的非同花牌(此牌型为最小的顺子)

        7.三条:仅有三张同一点数的牌,其余两张点数不同。

        如: 9 9 9 5 3

        8:两对:两张相同点数的牌,加另外两张相同点数的牌。

        如:K K 5 5 2

        9.一对:仅有两张相同点数的牌。

        如:10 10 9 4 2

        10.高牌:不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成,以点数决定大小。

        如:A 10 9 5 3 的非同花的牌

    点数大小为A>K>Q>J>10>9>8>7>6>5>4>3>2,

    若两个牌牌型相同,则比较点数,点数比较为从两副牌最大的牌到最小的牌依次开始比较大小,若出现某张牌大于对手的牌,则获胜。如A 8 7 4 2和A 6 5 3 1,先比较最大的,两幅都是A,继续比较次大的,8>7,则第一副牌获胜。(顺子5 4 3 2 A特判)

        若两副牌大小相同,则他们同时获胜。

        现在问这N个玩家哪些玩家获胜。(牌最大)

    输入

    多组测试数据,每组先输入N(2<=N<=10),代表玩家个数,接下来N行,每行4个数据X1i C1i X2i C2i,X1i,C1i表示第i个玩家的第一张牌,X1i表示牌的点数(A,2,3到K),C1i表示花色(S表示黑桃,H表示红心,C表示草花,D表示方片),同理X2i C2i表示第二张牌。然后是10个数据X1C,C1C......X10C,C10C。表示5张公共牌。

    输出

    第一行输出获胜玩家的个数,第二行输出获胜玩家的编号(由小到大)。

    样例输入

    3
    A H A S
    2 H 3 H
    4 C 5 D
    A D A C 4 H 5 H 6 H
    2
    A H A S
    A C A D
    5 D 6 C 7 D 8 H 10 C

    样例输出

    1
    2
    2
    1
    2

    疯狂地模拟、不要问为什么、不会、贴个代码

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define N 15
    
    struct Card
    {
        int point;//点数,颜色
        char color;
    };
    
    struct Maxcard
    {
        int point[5];//点数
        int flag;//牌型
    }maxcard[N];
    
    Card card[5];
    Card Pcard[N][2];
    Card Ccard[5];
    int n;
    
    bool cmp(Card a,Card b)
    {
        return a.point>b.point;
    }
    
    void init()//把每个选手的最大牌先初始化为最小
    {
        for(int i=0;i<n;i++)
        {
            maxcard[i].flag=10;
            maxcard[i].point[0]=7;
            maxcard[i].point[1]=5;
            maxcard[i].point[2]=4;
            maxcard[i].point[3]=3;
            maxcard[i].point[4]=2;
        }
    }
    
    int getp(char p[])
    {
        int pp;
        if(strcmp(p,"10")==0)pp=10;
        else if(p[0]>='2'&&p[0]<='9')pp=p[0]-'0';
        else if(p[0]=='J')pp=11;
        else if(p[0]=='Q')pp=12;
        else if(p[0]=='K')pp=13;
        else pp=14;
        return pp;
    }
    
    Maxcard gettype(Card select[5])
    {
        sort(select,select+5,cmp);
        bool samec=true;
        bool isstr=true;
        int i;
        for(i=1;i<5;i++)//判断同花和顺子
        {
            if(select[i].color!=select[i-1].color)samec=false;
            if(select[i].point!=select[i-1].point-1)isstr=false;
        }
        if(select[0].point==14&&select[1].point==5&&select[2].point==4&&select[3].point==3&&select[4].point==2)//A2345的情况
        {
            isstr=true;
            for(i=0;i<4;i++)select[i].point=select[i+1].point;
            select[4].point=1;
        }
        Maxcard ret;
        for(i=0;i<5;i++)ret.point[i]=select[i].point;
        int vis[15]={0};
        int maxsame=0,secsame=0,maxi;
        for(i=0;i<5;i++)
        {
            vis[ret.point[i]]++;
            if(vis[ret.point[i]]>maxsame)maxsame=vis[ret.point[i]],maxi=ret.point[i];
        }
        for(i=1;i<=14;i++)
        {
            if(maxi!=i&&vis[i]>secsame)secsame=vis[i];
        }
        if(samec&&isstr)ret.flag=2;//同花顺
        else if(maxsame==4)ret.flag=3;//四条
        else if(maxsame==3&&secsame==2)ret.flag=4;//葫芦
        else if(samec)ret.flag=5;//同花
        else if(isstr)ret.flag=6;//顺子
        else if(maxsame==3)ret.flag=7;//三条
        else if(maxsame==2&&secsame==2)ret.flag=8;//两对
        else if(maxsame==2)ret.flag=9;//一对
        else ret.flag=10;//高牌
        return ret;
    }
    
    int biger(Maxcard a,Maxcard b)
    {
        if(a.flag<b.flag)return 1;
        else if(a.flag>b.flag)return -1;
        else
        {
            for(int i=0;i<5;i++)
            {
                if(a.point[i]>b.point[i])return 1;
                else if(a.point[i]<b.point[i])return -1;
            }
            return 0;
        }
    }
    
    void solve()
    {
        Card temp[7];
        Card select[5];
        int i,j,k,l,cnt;
        for(i=2;i<7;i++)temp[i]=Ccard[i-2];
        for(i=0;i<n;i++)//计算每位玩家最大的牌
        {
            temp[0]=Pcard[i][0];
            temp[1]=Pcard[i][1];
            for(j=0;j<6;j++)//枚举第一张不要的牌
            {
                for(k=j+1;k<7;k++)//枚举第二张不要的牌
                {
                    cnt=0;
                    for(l=0;l<7;l++)
                    {
                        if(l!=j&&l!=k)select[cnt++]=temp[l];
                    }
                    Maxcard tt=gettype(select);
                    if(biger(tt,maxcard[i])==1)maxcard[i]=tt;
                }
            }
        }
        cnt=1;
        int ansi[N];
        Maxcard ans=maxcard[0];
        ansi[0]=0;
        for(i=1;i<n;i++)
        {
            if(biger(maxcard[i],ans)==1)
            {
                cnt=0;
                ans=maxcard[i];
                ansi[cnt++]=i;
            }
            else if(biger(maxcard[i],ans)==0)
            {
                ansi[cnt++]=i;
            }
        }
        printf("%d
    ",cnt);
        printf("%d",ansi[0]+1);
        for(i=1;i<cnt;i++)printf(" %d",ansi[i]+1);
        printf("
    ");
    }
    
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            init();
            int i;
            char p[2],c[2];
            for(i=0;i<n;i++)
            {
                scanf("%s%s",p,c);
                Pcard[i][0].point=getp(p);
                Pcard[i][0].color=c[0];
                scanf("%s%s",p,c);
                Pcard[i][1].point=getp(p);
                Pcard[i][1].color=c[0];
            }
            for(i=0;i<5;i++)
            {
                scanf("%s%s",p,c);
                Ccard[i].point=getp(p);
                Ccard[i].color=c[0];
            }
            solve();
        }
        return 0;
    }

     

    趁着还有梦想、将AC进行到底~~~by 452181625
  • 相关阅读:
    Workbooks 对象的 Open 方法参数说明
    OLDB读取excel的数据类型不匹配的解决方案
    使用OLEDB读取Excel
    C#锁定EXCEL工作表
    smple
    C# 获取当前文件、文件夹的路径及操作环境变量
    与eval()相关的技巧
    不写var的全局变量声明方式的一个副作用(Side Effects When Forgetting var)
    关于国内浏览器的userAgent识别
    for循环的效率改进写法二则
  • 原文地址:https://www.cnblogs.com/hate13/p/4489564.html
Copyright © 2020-2023  润新知