Atcoder JAG Practice Contest for ACM-ICPC Asia Regional 2012 B

点击这里进入题目

作者的话:同学们,我这个方法真的是算烦的,标称只有我的四分之一,但是假如你要深入理解题目我推荐我的程序,假如只是为了图个“方便”,还是别看了。

题目大意:根据德克萨斯扑克的规则,有五张牌应该是明牌,但是此时只明了三张,告诉你你的两张手牌,三张明牌,和对手的三张明牌,求你获胜的概率。

思路:模拟。模拟所有情况,一一对比,典型的思路简单,程序爆难,我大概调了两天。。。
我们拆开来看。


1.首先要用一个类型来存储牌,可以用pair,但是程序这么长很容易就忘记哪个是color,哪个是number,所以还是定义一个类型,放两个int进去,一个名为col,一个名为num。同时写好cmp函数,为下文快排做准备。

struct node
{
    int col,num;
}my[5],emy[5],com[10];
bool cmp(const node &a,const node &b)
{
    return a.num<b.num;
}
bool cmp2(const node &a,const node &b)
{
    return a.num>b.num;
}

2.读入,存储输进去的牌。因为我们要比较大小,所以我们将T,J,Q,K,A标为10,11,12,13,14。为了方便存储,把C,D,H,S标位1,2,3,4。分别存在my,emy(enemy),com(community)三个数组中。

//判断是否为数字
bool is_dig(char c)
{
    return (c>='0' && c<='9');
}
//将char的花色转为数字
int solcol(char c)
{
    if(c=='S')
    return 1;
    if(c=='H')
    return 2;
    if(c=='D')
    return 3;
    return 4;
}
//将char的牌转为int
int solnum(char c)
{
    if(is_dig(c))
    return int(c-'0');
    if(c=='T')
    return 10;
    if(c=='J')
    return 11;
    if(c=='Q')
    return 12;
    if(c=='K')
    return 13;
    return 14;
}
//记录我的牌
void tomy(int k,int col,int num)
{
    my[k].col=col;
    my[k].num=num;
}
//记录对手的牌
void toemy(int k,int col,int num)
{
    emy[k].col=col;
    emy[k].num=num;
}
//记录展开的牌
void tocom(int k,int col,int num)
{
    com[k].col=col;
    com[k].num=num;
}
//处理所有输入的数据
void tosub(string s,int flag,int k)
{
    int col=solcol(s[0]),num=solnum(s[1]);
    if(flag==1)
    tomy(k,col,num);
    else
    {
        if(flag==2)
        toemy(k,col,num);
        else
        tocom(k,col,num);
    }
    used[col][num]=1;
}

3.这样输入的处理就完成了,要开始处理数据,首先就是要暴力没有展开的几张牌。用四层循环搞定,保证牌不一样再check,我把这一段写在main函数里。

//解决问题
        int tot=0,ans=0;
        for(int i=1;i<=4;i++)
        {
            for(int j=2;j<=14;j++)
            {
                if(!used[i][j])
                {
                    for(int k=1;k<=4;k++)
                    {
                        for(int t=2;t<=14;t++)
                        {
                            if(!used[k][t])
                            {
                                if(i!=k || j!=t)
                                {
                                    tot++;
                                    if(check(i,j,k,t))
                                    {
                                        ans++;
                                        //aaa[check(i,j,k,t)]++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

4.check函数相当于一个交通枢纽,所有的组合方式按照大小排序塞在这里面。每当处在同一种排序方式,并且我的比对方大时,便会return,ans+1。

int check(int col1,int num1,int col2,int num2)
{
    //cout<<check10(col1,num1,col2,num2,1)<<" "<<check10(col1,num1,col2,num2,0)<<endl;
      if(check10(col1,num1,col2,num2,1)>check10(col1,num1,col2,num2,0))
      return 10;
      if(check10(col1,num1,col2,num2,1)<check10(col1,num1,col2,num2,0))
      return 0;
      if(check10(col1,num1,col2,num2,1)>0)
      return 0;
      if(check9(col1,num1,col2,num2,1)>check9(col1,num1,col2,num2,0))
      return 9;
      if(check9(col1,num1,col2,num2,1)<check9(col1,num1,col2,num2,0))
      return 0;
      if(check9(col1,num1,col2,num2,1)>0)
      return 0;
      if(check8(col1,num1,col2,num2,1)>check8(col1,num1,col2,num2,0))
      return 8;
      if(check8(col1,num1,col2,num2,1)<check8(col1,num1,col2,num2,0))
      return 0;
      if(check8(col1,num1,col2,num2,1)>0)
      return 0;
      if(check7(col1,num1,col2,num2,1)>check7(col1,num1,col2,num2,0))
      return 7;
      if(check7(col1,num1,col2,num2,1)<check7(col1,num1,col2,num2,0))
      return 0;
      if(check7(col1,num1,col2,num2,1)>0)
      return 0;
      if(check6(col1,num1,col2,num2,1)>check6(col1,num1,col2,num2,0))
      return 6;
      if(check6(col1,num1,col2,num2,1)<check6(col1,num1,col2,num2,0))
      return 0;
      if(check6(col1,num1,col2,num2,1)>0)
      return 0;
      if(check5(col1,num1,col2,num2,1)>check5(col1,num1,col2,num2,0))
      return 5;
      if(check5(col1,num1,col2,num2,1)<check5(col1,num1,col2,num2,0))
      return 0;
      if(check5(col1,num1,col2,num2,1)>0)
      return 0;
      if(check4(col1,num1,col2,num2,1)>check4(col1,num1,col2,num2,0))
      return 4;
      if(check4(col1,num1,col2,num2,1)<check4(col1,num1,col2,num2,0))
      return 0;
      if(check4(col1,num1,col2,num2,1)>0)
      return 0;
      if(check3(col1,num1,col2,num2,1)>check3(col1,num1,col2,num2,0))
      return 3;
      if(check3(col1,num1,col2,num2,1)<check3(col1,num1,col2,num2,0))
      return 0;
      if(check3(col1,num1,col2,num2,1)>0)
      return 0;
      if(check2(col1,num1,col2,num2,1)>check2(col1,num1,col2,num2,0))
      return 2;
      if(check2(col1,num1,col2,num2,1)<check2(col1,num1,col2,num2,0))
      return 0;
      if(check2(col1,num1,col2,num2,1)>0)
      return 0;
      if(check1(col1,num1,col2,num2,1)>check1(col1,num1,col2,num2,0))
      return 1;
      if(check1(col1,num1,col2,num2,1)<check1(col1,num1,col2,num2,0))
      return 0;
      return 0;
}

5.这一段是最难调的,就是各种牌型的处理方式,一看就能明白。我是用一个ans来表示所有牌型的大小,通过排序,再ans*100+x这种方式,可以将牌从多张,变成一个数,方便比较。都是相同的思想,只要按照规则来就行,就不一一解释了。(每个函数前要写上对应的牌型,放置后面调试时忘记)

//皇家
int check10(int col1,int num1,int col2,int num2,bool flag)
{
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        if(my[i].num>=10)
        a[my[i].col]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        if(emy[i].num>=10)
        a[emy[i].col]++;
    }
    for(int i=1;i<=3;i++)
    if(com[i].num>=10)
    a[com[i].col]++;
    if(num1>=10)
    a[col1]++;
    if(num2>=10)
    a[col2]++;
    for(int i=1;i<=4;i++)
    {
        if(a[i]==5)
        return 1;
    }
    return 0;
}
//同花顺
int check9(int col1,int num1,int col2,int num2,bool flag)
{
    int a[100],maxn=0;
    for(int k=1;k<=4;k++)
    {
        memset(a,0,sizeof(a));
            for(int i=1;i<=2;i++)
            {
                if(flag)
                {
                    if(my[i].col==k)
                    {
                       a[my[i].num]++;
                        if(my[i].num==14)
                        a[1]++;
                    }
                }
                else
                {
                    if(emy[i].col==k)
                    {
                       a[emy[i].num]++;
                        if(emy[i].num==14)
                        a[1]++;
                    }
                }
            }
            for(int i=1;i<=3;i++)
            {
                if(com[i].col==k)
                {
                    a[com[i].num]++;
                    if(com[i].num==14)
                    a[1]++;
                }
            }
            if(col1==k)
            {
                a[num1]++;
                if(num1==14)
                a[1]++;
            }
            if(col2==k)
            {
                a[num2]++;
                if(num2==14)
                a[1]++;
            }
            for(int i=14;i>=5;i--)
            {
                if(a[i] && a[i-1] && a[i-2] && a[i-3] && a[i-4])
                {
                    maxn=max(maxn,i);
                    break;
                }
            }
    }
    if(maxn)
    return maxn;
    return 0;
}
//四张
int check8(int col1,int num1,int col2,int num2,bool flag)
{
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    int ans=0;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=4)
        {
            ans=i;
            a[i]-=4;
            break;
        }
    }
    if(!ans)
    return 0;
    for(int i=14;i>=2;i--)
    {
        if(a[i])
        {
            ans=ans*100+i;
            break;
        }
    }
    if(ans>100)
    return ans;
    return 0;
}
//三张
int check7(int col1,int num1,int col2,int num2,bool flag)
{
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    int s1=0,s2=0,pl=0;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=3)
        {
            s1=i;
            a[i]-=3;
            break;
        }
    }
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=2)
        {
            if(flag)
            {
                s2=i;
                break;
            }
            else
            {
                if(i!=pl)
                {
                    s2=i;
                    break;
                }
            }
        }
    }
    if(s1 && s2)
    return s1*100+s2;
    return 0;
}
//同花
ll check6(int col1,int num1,int col2,int num2,bool flag)
{
    ll ans[50];
    int ok[50];
    node a[100];

    memset(ok,0,sizeof(ok));
    memset(ans,0,sizeof(ans));
    int tot=0,sum=1;
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[++tot]=my[i];
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[++tot]=emy[i];
    }
    for(int i=1;i<=3;i++)
    a[++tot]=com[i];
    a[++tot].num=num1;
    a[tot].col=col1;
    a[++tot].num=num2;
    a[tot].col=col2;
    sort(a+1,a+tot+1,cmp2);
    for(int i=1;i<=tot;i++)
    {
        if(ok[a[i].col]<5)
        {
            ans[a[i].col]=ans[a[i].col]*100+1ll*a[i].num;
            ok[a[i].col]++;
        }
    }
    for(int i=1;i<=4;i++)
    if(ok[i]==5 && ans[i]>1e8)
    return ans[i];
    return 0;
}
//顺子
int check5(int col1,int num1,int col2,int num2,bool flag)
{
    int num[50];
    node a[100];
    for(int i=0;i<50;i++)
    num[i]=1;
    int tot=0,sum=1;
    for(int i=1;i<=2;i++)
    {
        if(flag)
        {
            a[++tot]=my[i];
            if(my[i].num==14)
            {
                a[++tot].col=my[i].col;
                a[tot].num=1;
            }
        }
        else
        {
            a[++tot]=emy[i];
            if(emy[i].num==14)
            {
                a[++tot].col=emy[i].col;
                a[tot].num=1;
            }
        }
    }
    for(int i=1;i<=3;i++)
    {
      a[++tot]=com[i];
      if(com[i].num==14)
      {
          a[++tot].col=com[i].col;
          a[tot].num=1;
      }
    }
    a[++tot].num=num1;
    a[tot].col=col1;
    a[++tot].num=num2;
    a[tot].col=col2;
    if(num1==14)
    {
        a[++tot].col=col1;
        a[tot].num=1;
    }
    if(num2==14)
    {
        a[++tot].col=col2;
        a[tot].num=1;
    }
    sort(a+1,a+tot+1,cmp);
    for(int i=1;i<tot;i++)
    {
        for(int j=i+1;j<=tot;j++)
          if(a[j].num==a[i].num+1)
          num[a[j].num]=max(num[a[j].num],num[a[i].num]+1);
    }
    for(int i=14;i>=2;i--)
    if(num[i]>=5)
    return i;
    return 0;
}
//三张
int check4(int col1,int num1,int col2,int num2,bool flag)
{
    int ans=0,num=2;
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=3)
        {
            ans=i;
            a[i]-=3;
            break;
        }
    }
    if(!ans)
    return 0;
    for(int i=14;i>=2;i--)
    {
        if(a[i] && num)
        {
            num--;
            ans=ans*100+i;
        }
    }
    if(ans>1e4)
    return ans;
    return 0;
}
//两对
int check3(int col1,int num1,int col2,int num2,bool flag)
{
    int ans=0,p1=0,p2=0;
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=2)
        {
            if(!p1)
            {
                if(flag)
                {
                    ans=i;
                    p1=i;
                    a[i]-=2;
                }
                else
                {
                    p1=i;
                    a[i]-=2;
                }
            }
            else
                if(!p2)
                {
                    if(flag)
                    {
                        ans=ans*100+i;
                        p2=i;
                        a[i]-=2;
                    }
                    else
                    {
                        p2=i;
                        a[i]-=2;
                    }
                }
        }
    }
    if(!p1 || !p2)
    return 0;
    if(!flag)
    ans=p1*100+p2;
    for(int i=14;i>=2;i--)
    {
        if(a[i])
        {
            ans=ans*100+i;
            break;
        }
    }
    if(ans>1e4)
    return ans;
    return 0;
}
//一对
int check2(int col1,int num1,int col2,int num2,bool flag)
{
    int ans=0,sum=0,a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=2)
        {
            ans=i;
            a[i]-=2;
            break;
        }
    }
    if(!ans)
    return 0;
    for(int i=14;i>=2;i--)
    {
        if(a[i] && sum<3)
        {
            ans=ans*100+i;
            sum++;
        }
    }
    if(ans>1e6)
    return ans;
    return 0;
}
//高牌
ll check1(int col1,int num1,int col2,int num2,bool flag)
{
    ll ans=0;
    int sum=5,a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(sum && a[i])
        {
            ans=ans*100+i;
            sum--;
        }
    }
    if(ans>1e8)
    return ans;
    return 0;
}

基本没人会看到这,下面是AC程序,大概有700行。(前方高能)

//库省略
using namespace std;
int n,m;
bool used[5][205];
struct node
{
    int col,num;
}my[5],emy[5],com[10];
bool cmp(const node &a,const node &b)
{
    return a.num<b.num;
}
bool cmp2(const node &a,const node &b)
{
    return a.num>b.num;
}
//判断是否为数字
bool is_dig(char c)
{
    return (c>='0' && c<='9');
}
//将char的花色转为数字
int solcol(char c)
{
    if(c=='S')
    return 1;
    if(c=='H')
    return 2;
    if(c=='D')
    return 3;
    return 4;
}
//将char的牌转为int
int solnum(char c)
{
    if(is_dig(c))
    return int(c-'0');
    if(c=='T')
    return 10;
    if(c=='J')
    return 11;
    if(c=='Q')
    return 12;
    if(c=='K')
    return 13;
    return 14;
}
//记录我的牌
void tomy(int k,int col,int num)
{
    my[k].col=col;
    my[k].num=num;
}
//记录对手的牌
void toemy(int k,int col,int num)
{
    emy[k].col=col;
    emy[k].num=num;
}
//记录展开的牌
void tocom(int k,int col,int num)
{
    com[k].col=col;
    com[k].num=num;
}
//处理所有输入的数据
void tosub(string s,int flag,int k)
{
    int col=solcol(s[0]),num=solnum(s[1]);
    if(flag==1)
    tomy(k,col,num);
    else
    {
        if(flag==2)
        toemy(k,col,num);
        else
        tocom(k,col,num);
    }
    used[col][num]=1;
}
//皇家
int check10(int col1,int num1,int col2,int num2,bool flag)
{
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        if(my[i].num>=10)
        a[my[i].col]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        if(emy[i].num>=10)
        a[emy[i].col]++;
    }
    for(int i=1;i<=3;i++)
    if(com[i].num>=10)
    a[com[i].col]++;
    if(num1>=10)
    a[col1]++;
    if(num2>=10)
    a[col2]++;
    for(int i=1;i<=4;i++)
    {
        if(a[i]==5)
        return 1;
    }
    return 0;
}
//同花顺
int check9(int col1,int num1,int col2,int num2,bool flag)
{
    int a[100],maxn=0;
    for(int k=1;k<=4;k++)
    {
        memset(a,0,sizeof(a));
            for(int i=1;i<=2;i++)
            {
                if(flag)
                {
                    if(my[i].col==k)
                    {
                       a[my[i].num]++;
                        if(my[i].num==14)
                        a[1]++;
                    }
                }
                else
                {
                    if(emy[i].col==k)
                    {
                       a[emy[i].num]++;
                        if(emy[i].num==14)
                        a[1]++;
                    }
                }
            }
            for(int i=1;i<=3;i++)
            {
                if(com[i].col==k)
                {
                    a[com[i].num]++;
                    if(com[i].num==14)
                    a[1]++;
                }
            }
            if(col1==k)
            {
                a[num1]++;
                if(num1==14)
                a[1]++;
            }
            if(col2==k)
            {
                a[num2]++;
                if(num2==14)
                a[1]++;
            }
            for(int i=14;i>=5;i--)
            {
                if(a[i] && a[i-1] && a[i-2] && a[i-3] && a[i-4])
                {
                    maxn=max(maxn,i);
                    break;
                }
            }
    }
    if(maxn)
    return maxn;
    return 0;
}
//四张
int check8(int col1,int num1,int col2,int num2,bool flag)
{
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    int ans=0;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=4)
        {
            ans=i;
            a[i]-=4;
            break;
        }
    }
    if(!ans)
    return 0;
    for(int i=14;i>=2;i--)
    {
        if(a[i])
        {
            ans=ans*100+i;
            break;
        }
    }
    if(ans>100)
    return ans;
    return 0;
}
//三张
int check7(int col1,int num1,int col2,int num2,bool flag)
{
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    int s1=0,s2=0,pl=0;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=3)
        {
            s1=i;
            a[i]-=3;
            break;
        }
    }
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=2)
        {
            if(flag)
            {
                s2=i;
                break;
            }
            else
            {
                if(i!=pl)
                {
                    s2=i;
                    break;
                }
            }
        }
    }
    if(s1 && s2)
    return s1*100+s2;
    return 0;
}
//同花
ll check6(int col1,int num1,int col2,int num2,bool flag)
{
    ll ans[50];
    int ok[50];
    node a[100];

    memset(ok,0,sizeof(ok));
    memset(ans,0,sizeof(ans));
    int tot=0,sum=1;
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[++tot]=my[i];
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[++tot]=emy[i];
    }
    for(int i=1;i<=3;i++)
    a[++tot]=com[i];
    a[++tot].num=num1;
    a[tot].col=col1;
    a[++tot].num=num2;
    a[tot].col=col2;
    sort(a+1,a+tot+1,cmp2);
    for(int i=1;i<=tot;i++)
    {
        if(ok[a[i].col]<5)
        {
            ans[a[i].col]=ans[a[i].col]*100+1ll*a[i].num;
            ok[a[i].col]++;
        }
    }
    for(int i=1;i<=4;i++)
    if(ok[i]==5 && ans[i]>1e8)
    return ans[i];
    return 0;
}
//顺子
int check5(int col1,int num1,int col2,int num2,bool flag)
{
    int num[50];
    node a[100];
    for(int i=0;i<50;i++)
    num[i]=1;
    int tot=0,sum=1;
    for(int i=1;i<=2;i++)
    {
        if(flag)
        {
            a[++tot]=my[i];
            if(my[i].num==14)
            {
                a[++tot].col=my[i].col;
                a[tot].num=1;
            }
        }
        else
        {
            a[++tot]=emy[i];
            if(emy[i].num==14)
            {
                a[++tot].col=emy[i].col;
                a[tot].num=1;
            }
        }
    }
    for(int i=1;i<=3;i++)
    {
      a[++tot]=com[i];
      if(com[i].num==14)
      {
          a[++tot].col=com[i].col;
          a[tot].num=1;
      }
    }
    a[++tot].num=num1;
    a[tot].col=col1;
    a[++tot].num=num2;
    a[tot].col=col2;
    if(num1==14)
    {
        a[++tot].col=col1;
        a[tot].num=1;
    }
    if(num2==14)
    {
        a[++tot].col=col2;
        a[tot].num=1;
    }
    sort(a+1,a+tot+1,cmp);
    for(int i=1;i<tot;i++)
    {
        for(int j=i+1;j<=tot;j++)
          if(a[j].num==a[i].num+1)
          num[a[j].num]=max(num[a[j].num],num[a[i].num]+1);
    }
    for(int i=14;i>=2;i--)
    if(num[i]>=5)
    return i;
    return 0;
}
//三张
int check4(int col1,int num1,int col2,int num2,bool flag)
{
    int ans=0,num=2;
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=3)
        {
            ans=i;
            a[i]-=3;
            break;
        }
    }
    if(!ans)
    return 0;
    for(int i=14;i>=2;i--)
    {
        if(a[i] && num)
        {
            num--;
            ans=ans*100+i;
        }
    }
    if(ans>1e4)
    return ans;
    return 0;
}
//两对
int check3(int col1,int num1,int col2,int num2,bool flag)
{
    int ans=0,p1=0,p2=0;
    int a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=2)
        {
            if(!p1)
            {
                if(flag)
                {
                    ans=i;
                    p1=i;
                    a[i]-=2;
                }
                else
                {
                    p1=i;
                    a[i]-=2;
                }
            }
            else
                if(!p2)
                {
                    if(flag)
                    {
                        ans=ans*100+i;
                        p2=i;
                        a[i]-=2;
                    }
                    else
                    {
                        p2=i;
                        a[i]-=2;
                    }
                }
        }
    }
    if(!p1 || !p2)
    return 0;
    if(!flag)
    ans=p1*100+p2;
    for(int i=14;i>=2;i--)
    {
        if(a[i])
        {
            ans=ans*100+i;
            break;
        }
    }
    if(ans>1e4)
    return ans;
    return 0;
}
//一对
int check2(int col1,int num1,int col2,int num2,bool flag)
{
    int ans=0,sum=0,a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(a[i]>=2)
        {
            ans=i;
            a[i]-=2;
            break;
        }
    }
    if(!ans)
    return 0;
    for(int i=14;i>=2;i--)
    {
        if(a[i] && sum<3)
        {
            ans=ans*100+i;
            sum++;
        }
    }
    if(ans>1e6)
    return ans;
    return 0;
}
//高牌
ll check1(int col1,int num1,int col2,int num2,bool flag)
{
    ll ans=0;
    int sum=5,a[50];
    memset(a,0,sizeof(a));
    if(flag)
    {
        for(int i=1;i<=2;i++)
        a[my[i].num]++;
    }
    else
    {
        for(int i=1;i<=2;i++)
        a[emy[i].num]++;
    }
    for(int i=1;i<=3;i++)
    a[com[i].num]++;
    a[num1]++;
    a[num2]++;
    for(int i=14;i>=2;i--)
    {
        if(sum && a[i])
        {
            ans=ans*100+i;
            sum--;
        }
    }
    if(ans>1e8)
    return ans;
    return 0;
}
int check(int col1,int num1,int col2,int num2)
{
    //cout<<check10(col1,num1,col2,num2,1)<<" "<<check10(col1,num1,col2,num2,0)<<endl;
      if(check10(col1,num1,col2,num2,1)>check10(col1,num1,col2,num2,0))
      return 10;
      if(check10(col1,num1,col2,num2,1)<check10(col1,num1,col2,num2,0))
      return 0;
      if(check10(col1,num1,col2,num2,1)>0)
      return 0;
      if(check9(col1,num1,col2,num2,1)>check9(col1,num1,col2,num2,0))
      return 9;
      if(check9(col1,num1,col2,num2,1)<check9(col1,num1,col2,num2,0))
      return 0;
      if(check9(col1,num1,col2,num2,1)>0)
      return 0;
      if(check8(col1,num1,col2,num2,1)>check8(col1,num1,col2,num2,0))
      return 8;
      if(check8(col1,num1,col2,num2,1)<check8(col1,num1,col2,num2,0))
      return 0;
      if(check8(col1,num1,col2,num2,1)>0)
      return 0;
      if(check7(col1,num1,col2,num2,1)>check7(col1,num1,col2,num2,0))
      return 7;
      if(check7(col1,num1,col2,num2,1)<check7(col1,num1,col2,num2,0))
      return 0;
      if(check7(col1,num1,col2,num2,1)>0)
      return 0;
      if(check6(col1,num1,col2,num2,1)>check6(col1,num1,col2,num2,0))
      return 6;
      if(check6(col1,num1,col2,num2,1)<check6(col1,num1,col2,num2,0))
      return 0;
      if(check6(col1,num1,col2,num2,1)>0)
      return 0;
      if(check5(col1,num1,col2,num2,1)>check5(col1,num1,col2,num2,0))
      return 5;
      if(check5(col1,num1,col2,num2,1)<check5(col1,num1,col2,num2,0))
      return 0;
      if(check5(col1,num1,col2,num2,1)>0)
      return 0;
      if(check4(col1,num1,col2,num2,1)>check4(col1,num1,col2,num2,0))
      return 4;
      if(check4(col1,num1,col2,num2,1)<check4(col1,num1,col2,num2,0))
      return 0;
      if(check4(col1,num1,col2,num2,1)>0)
      return 0;
      if(check3(col1,num1,col2,num2,1)>check3(col1,num1,col2,num2,0))
      return 3;
      if(check3(col1,num1,col2,num2,1)<check3(col1,num1,col2,num2,0))
      return 0;
      if(check3(col1,num1,col2,num2,1)>0)
      return 0;
      if(check2(col1,num1,col2,num2,1)>check2(col1,num1,col2,num2,0))
      return 2;
      if(check2(col1,num1,col2,num2,1)<check2(col1,num1,col2,num2,0))
      return 0;
      if(check2(col1,num1,col2,num2,1)>0)
      return 0;
      if(check1(col1,num1,col2,num2,1)>check1(col1,num1,col2,num2,0))
      return 1;
      if(check1(col1,num1,col2,num2,1)<check1(col1,num1,col2,num2,0))
      return 0;
      return 0;
}
int main()
{
    int k,aaa[15];
    memset(aaa,0,sizeof(aaa));
    string s;
    cin>>s;
    while(s!="#")
    {
        memset(used,0,sizeof(used));
        tosub(s,1,1);
        cin>>s;
        tosub(s,1,2);
        for(int i=1;i<=2;i++)
        {
            cin>>s;
            tosub(s,2,i);
        }
        for(int i=1;i<=3;i++)
        {
            cin>>s;
            tosub(s,3,i);
        }
        //解决问题
        int tot=0,ans=0;
        for(int i=1;i<=4;i++)
        {
            for(int j=2;j<=14;j++)
            {
                if(!used[i][j])
                {
                    for(int k=1;k<=4;k++)
                    {
                        for(int t=2;t<=14;t++)
                        {
                            if(!used[k][t])
                            {
                                if(i!=k || j!=t)
                                {
                                    tot++;
                                    if(check(i,j,k,t))
                                    {
                                        ans++;
                                        aaa[check(i,j,k,t)]++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        //cout<<ans<<' '<<tot<<endl;
        //for(int i=1;i<=10;i++)
        //cout<<aaa[i]<<" ";
        //cout<<endl;
        printf("%0.8lf
",double(ans)/tot);
        cin>>s;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/NightRaven/p/9333242.html