zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    Power BI 根据用户权限动态生成导航跳转目标
    Power BI Tooltips 增强功能
    Power BI refresh error “could not load file or assembly…provided impersonation level is invalid”
    SQL 错误代码 18456
    如何使用SQL Server Integration Services从多个Excel文件读取数据
    通过表格编辑器将现有表引入Power BI数据流
    Power BI 中动态增长的柱状图
    ambari2.7.3离线安装hdp3.1.0时,ambari-hdp-1.repo中baseurl无值
    ambari 安装 cannot download file mysql-connector-java from http://8080/resource/mysql-connector-java.jar
    洛谷P4180 [BJWC2010]严格次小生成树
  • 原文地址:https://www.cnblogs.com/hate13/p/4489564.html
Copyright © 2011-2022 走看看