参考题解 原题 子集生成的问题。用增量构造法。需要先弄清楚规则。特殊的顺子有两种,TJQKA和A2345。
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=15;
char *sf="A23456789TJQK";
char *su="CDHS";
char str[9][20]={"straight-flush","four-of-a-kind","full-house","flush","straight","three-of-a-kind",
"two-pairs","one-pair","highest-card"};
int A[8],ans,face[maxn],suit[maxn][5];
char s[maxn][5];
int search(int cur)
{
memset(face,0,sizeof(face));
memset(suit,0,sizeof(suit));
int i,j,k,f,first,m,n;
//printf("cur=%d\n",cur);
for(i=0;i<5-cur;i++)
A[cur+i]=5+i;
for(i=0;i<5;i++)
{
m=strchr(sf,s[A[i]][0])-sf;
n=strchr(su,s[A[i]][1])-su;
face[m]++;
suit[m][n]++;
}
for(first=0;!face[first];first++);
for(i=first;i<13;i++)
if(face[i])
{
for(j=i,n=0;j<13&&face[j];j++)
n++;
if(n==5||(n==4&&j==13&&face[0]))
{
for(k=0;k<4;k++)
if(suit[first][k])
break;
for(f=first+1;f<13;f++)
if(face[f]&&suit[f][k]!=suit[first][k])
break;
if(f==13)
return 0;
}
}
for(i=first;i<13;i++)
if(face[i]==4)
return 1;
for(i=first;i<13;i++)
if(face[i]==3)
{
for(j=first;j<13;j++)
if(face[j]==2)
return 2;
break;
}
for(k=0;k<4;k++)
{
for(i=first;i<13;i++)
if(face[i]>1||(face[i]&&!suit[i][k]))
break;
if(i==13)
return 3;
}
for(i=first;i<13;i++)
if(face[i])
{
for(n=0,j=i;j<13&&face[j];j++)
n++;
if(n==5||(n==4&&j==13&&face[0]))
return 4;
}
for(i=first;i<13;i++)
if(face[i]==3)
return 5;
for(i=first;i<13;i++)
if(face[i]==2)
for(j=i+1;j<13;j++)
if(face[j]==2)
return 6;
for(i=first;i<13;i++)
if(face[i]==2)
return 7;
return 8;
}
void try_subset(int cur)
{
if(cur<=5)
{
//for(int i=0;i<cur;i++) printf("%d ",A[i]);
//printf("\n");
int k=search(cur);
if(k<ans) ans=k;
}
int s=cur? A[cur-1]+1:0;
for(int i=s;i<5;i++)
{
A[cur]=i;
try_subset(cur+1);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("131.txt","r",stdin);
#endif
int i;
while(scanf("%s",s[0])==1)
{
for(i=1;i<10;i++) scanf("%s",s[i]);
printf("Hand:");
for(i=0;i<5;i++) printf(" %s",s[i]);
printf(" Deck:");
for(i=5;i<10;i++) printf(" %s",s[i]);
printf(" Best hand: ");
ans=8;
try_subset(0);
//printf("%s",str[t++]);
printf("%s\n",str[ans]);
}
return 0;
}