131 - The Psychic Poker Player

扑克牌型

下面列出从大到小的扑克牌面. 这是所有的扑克通用规则。

1
Royal Flush 同花大顺又称皇家同花顺
它是所有德州扑克中的王牌,即使您经常玩扑克,也很少见到这样的牌。好比打高尔夫球一杆进洞一样。它是由T(10)到Ace的清一色同花组成。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
2
Straight Flush 同花顺
除了由最大同花所组成的同花大顺以外的同花组成的顺子。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
3
Four-of-a-Kind 四条
四张同样的牌+任意一张牌 。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
4

Full House 俘虏或船牌或葫芦 
三条带一对,即三张同样的牌带两张同样的牌。如都是Full House,则先比较谁的三条大,如三条一样大,则比谁的两对大。如:

Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
5
Flush 五张同花
用五张同一花色但不相连的牌型组成,如都是五张同花,则谁的同花牌大谁赢。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
6
Straight 五张顺子
由五张相连但不同花色的牌组成,在连牌中,Ace是既可作最大也可以作最小的牌。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
7
Three-of-a-Kind 三条
即三张同样的牌。它有两种叫法,取决于一对牌是在您手中还是在桌上。一对在手中,桌上有一张,称之为“set”;v如手中有一张,桌上有一对,则称之为“Three of A Kind”。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
8
Two Pair 两对
由五张牌中的两对牌组成。如果都有两对,则先比大对,再比小对 。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
9
One Pair 一对
当不止一人有同样的一对牌时,则要比一对后面的牌,称之为“Kickers”。记住,德州扑克是挑选最好的五张牌去比。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player
   
10
High Card 大牌
无以上任何牌型时,决定牌的大小 。
Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player Uva <wbr> <wbr>131 <wbr>- <wbr>The <wbr>Psychic <wbr>Poker <wbr>Player

描述:这道题亏大了,差点哭死,怎么着也找不到问题所在,原来是少了一个冒号,
哭死啦……题意就是德州扑克牌,没什么特别的地方,还有就是只能先舍弃手中的牌,
才能抓牌,并且抓能抓取与舍弃的牌数相同的牌数,还有就是只能抓一次牌,
不管几张,只能一次。不过也学会了德州扑克牌的玩法,挺有意思的……

这道题写的代码太长了,并且耗时也多,所以就今天中午又重写了一次,
缩减了许多,具体看代码二

第一次代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
struct Card
{
    char num;
    char flower;
    int num_flag;
};
Card p[5],q[5];
char  str[]= {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
int flag,count,value[14];
void straight_flush(Card  *r,int x)
{
    if(flag) return;
    memset(value,0,sizeof(value));
    for(int j=0; j<13; j++)
        if(r[0].num==str[j])
        {
            value[j]=1;
            if(!j) value[13]=1;
            break;
        }
    for(int i=1; i<5; i++)
    {
        if(r[i-1].flower!=r[i].flower) break;
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]=1;
                if(!j) value[13]=1;
                break;
            }
    }
    int y(0);
    if(value[0])
    {
        for(int i=0; i<5; i++)
            if(value[i]) y++;
        if(y==5)
        {
            printf("straight-flush\n");
            flag=1;
            return;
        }
    }
    y=0;
    for(int i=1; i<14; i++)
    {
        if(value[i]) y++;
        if(y==5)
        {
            printf("straight-flush\n");
            flag=1;
            return;
        }
        if(y>=1&&!value[i]) break;
    }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                straight_flush(m,x+1);
            }
}
void four_of_a_kind(Card *r,int x)
{
    if(flag) return;
    memset(value,0,sizeof(value));
    for(int i=0; i<5; i++)
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]++;
                break;
            }
    for(int i=0; i<14; i++)
        if(value[i]>=4)
        {
            printf("four-of-a-kind\n");
            flag=1;
            return;
        }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                four_of_a_kind(m,x+1);
            }
}
void full_house(Card *r,int x)
{
    if(flag) return;
    memset(value,0,sizeof(value));
    for(int i=0; i<5; i++)
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]++;
                break;
            }
    int y(0),v(0);
    for(int i=0; i<14; i++)
        if(value[i]==3) y++;
        else if(value[i]==2) v++;
        else if(y&&v)
        {
            printf("full-house\n");
            flag=1;
            return;
        }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                full_house(m,x+1);
            }
}
void flush(Card *r,int x)
{
    if(flag) return;
    for(int i=1; i<5; i++)
        if(r[i].flower!=r[i-1].flower) flag=1;
    if(!flag)
    {
        flag=1;
        printf("flush\n");
        return;
    }
    else flag=0;
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                flush(m,x+1);
            }
}
void straight(Card *r,int x)
{
    if(flag) return;
    int y;
    memset(value,0,sizeof(value));
    for(int i=0; i<5; i++)
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]=1;
                if(!j) value[13]=1;
                break;
            }
    if(value[0])
    {
        y=0;
        for(int i=0; i<5; i++)
            if(value[i]) y++;
        if(y==5)
        {
            printf("straight\n");
            flag=1;
            return;
        }
    }
    y=0;
    for(int i=1; i<14; i++)
    {
        if(value[i]) y++;
        if(y==5)
        {
            printf("straight\n");
            flag=1;
            return;
        }
        if(y>=1&&!value[i]) break;
    }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                straight(m,x+1);
            }
}
void three_of_a_kind(Card *r,int x)
{
    if(flag) return;
    memset(value,0,sizeof(value));
    for(int i=0; i<5; i++)
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]++;
                break;
            }
    for(int i=0; i<14; i++)
        if(value[i]==3)
        {
            printf("three-of-a-kind\n");
            flag=1;
            return;
        }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                three_of_a_kind(m,x+1);
            }
}
void two_pairs(Card *r,int x)
{
    if(flag) return;
    memset(value,0,sizeof(value));
    for(int i=0; i<5; i++)
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]++;
                break;
            }
    int y=0;
    for(int i=0; i<14; i++)
        if(value[i]==2)
        {
            y++;
            if(y!=2) continue;
            printf("two-pairs\n");
            flag=1;
            return;
        }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                two_pairs(m,x+1);
            }
}
void one_pair(Card *r,int x)
{
    if(flag) return;
    memset(value,0,sizeof(value));
    for(int i=0; i<5; i++)
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                value[j]++;
                break;
            }
    for(int i=0; i<14; i++)
        if(value[i]==2)
        {
            printf("one-pair\n");
            flag=1;
            return;
        }
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                one_pair(m,x+1);
            }
}
int main()
{
    //freopen("a.txt","r",stdin);
    char c,s[100];
    count=0;
    while(scanf("%c",&c)!=EOF)
    {
        if(c=='\n'||count>9)
        {
            if(c!='\n') gets(s);
            count=count-5;
            printf("Hand: ");
            for(int i=0; i<5; i++) printf("%c%c ",p[i].num,p[i].flower);
            printf("Deck: ");
            for(int i=0; i<count; i++) printf("%c%c ",q[i].num,q[i].flower);
            if(c!='\n') printf("%s ",s);
            printf("Best hand: ");
            flag=0;
            straight_flush(p,0);
            if(!flag) four_of_a_kind(p,0);
            if(!flag) full_house(p,0);
            if(!flag) flush(p,0);
            if(!flag) straight(p,0);
            if(!flag) three_of_a_kind(p,0);
            if(!flag) two_pairs(p,0);
            if(!flag) one_pair(p,0);
            if(!flag) printf("highest-card\n");
            count=0;
        }
        else if(c!=' ')
        {
            Card k;
            k.num=c;
            scanf("%c",&c);
            k.flower=c;
            k.num_flag=0;
            if(count<=4) p[count]=k;
            else q[count-5]=k;
            count++;
        }
    }
    return 0;
}
第二次代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
using namespace std;
struct Card
{
    char num;
    char flower;
    int num_flag;
};
Card p[5],q[5];
char  str[]= {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
string s_name[9]= {"straight-flush","four-of-a-kind","full-house","flush",
        "straight","three-of-a-kind","two-pairs","one-pair","highest-card"
                  };
int flag[15],count,value[15], solve_flag[10];
void solve(Card *r,int x)
{
    if(solve_flag[0]) return;
    int flag_flush(0);
    memset(value,0,sizeof(value));
    memset(flag,0,sizeof(flag));
    for(int j=0; j<13; j++)
        if(r[0].num==str[j])
        {
            flag[j]=1;
            if(!j) flag[13]=1;
            value[j]++;
            break;
        }
    for(int i=1; i<5; i++)
    {
        if(r[i-1].flower!=r[i].flower) flag_flush=1;
        for(int j=0; j<13; j++)
            if(r[i].num==str[j])
            {
                flag[j]=1;
                if(!j) flag[13]=1;
                value[j]++;
                break;
            }
    }
    if(!flag_flush) solve_flag[3]=1;
    int y(0),v(0);
    if(flag[0])
    {
        for(int i=0; i<5; i++)
            if(flag[i]) y++;
        if(y==5&&!flag_flush)
        {
            solve_flag[0]=1;
            return;
        }
        if(y==5&&flag_flush) solve_flag[4]=1;
    }
    y=0;
    for(int i=1; i<14; i++)
    {
        if(flag[i]) y++;
        if(y==5&&!flag_flush)
        {
            solve_flag[0]=1;
            return;
        }
        if(y==5&&flag_flush)
        {
            solve_flag[4]=1;
            break;
        }
        if(y>=1&&!flag[i]) break;
    }
    y=v=0;
    for(int i=0; i<14; i++)
        if(value[i]>=4) solve_flag[1]=1;
        else if(value[i]==3) v++;
        else if(value[i]==2) y++;
    if(v&&y==1) solve_flag[2]=1;
    if(v&&!y) solve_flag[5]=1;
    if(!v&&y==2) solve_flag[6]=1;
    if(!v&&y==1) solve_flag[7]=1;
    if(x<count)
        for(int i=0; i<5; i++)
            if(!r[i].num_flag)
            {
                Card m[5];
                for(int j=0; j<5; j++) m[j]=r[j];
                m[i]=q[x];
                m[i].num_flag=1;
                solve(m,x+1);
            }
}
int main()
{
    //freopen("a.txt","r",stdin);
    char c,s[100];
    count=0;
    while(scanf("%c",&c)!=EOF)
    {
        if(c=='\n'||count>9)
        {
            if(c!='\n') gets(s);
            count=count-5;
            printf("Hand: ");
            for(int i=0; i<5; i++) printf("%c%c ",p[i].num,p[i].flower);
            printf("Deck: ");
            for(int i=0; i<count; i++) printf("%c%c ",q[i].num,q[i].flower);
            if(c!='\n') printf("%s ",s);
            printf("Best hand: ");
            memset(solve_flag,0,sizeof(solve_flag));
            solve_flag[8]=1;
            solve(p,0);
            for(int i=0; i<9; i++)
                if(solve_flag[i])
                {
                    cout<<s_name[i]<<endl;
                    break;
                }
            count=0;
        }
        else if(c!=' ')
        {
            Card k;
            k.num=c;
            scanf("%c",&c);
            k.flower=c;
            k.num_flag=0;
            if(count<=4) p[count]=k;
            else q[count-5]=k;
            count++;
        }
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值