Atcoder JAG Practice Contest for ACM-ICPC Asia Regional 2012 B - Texas hold 'em(巨型模拟)
作者的话:同学们,我这个方法真的是算烦的,标称只有我的四分之一,但是假如你要深入理解题目我推荐我的程序,假如只是为了图个“方便”,还是别看了。
题目大意:根据德克萨斯扑克的规则,有五张牌应该是明牌,但是此时只明了三张,告诉你你的两张手牌,三张明牌,和对手的三张明牌,求你获胜的概率。
思路:模拟。模拟所有情况,一一对比,典型的思路简单,程序爆难,我大概调了两天。。。
我们拆开来看。
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\n",double(ans)/tot);
cin>>s;
}
return 0;
}