Straight-Flush 同花顺
four-of-a-kind 四带一
full-house 三带一对
flush 同花
straight 顺子
three-of-a-kind 三张相同的
two-pairs 两对
one-pair 一对
highest-card 最大牌
//枚举到蛋疼,不过提交的时候还是挺顺利的
//以下是网上找到的扑克通用规则,理解就容易多了
扑克牌型
下面列出从大到小的扑克牌面. 这是所有的扑克通用规则。
1
| Royal Flush同花大顺又称皇家同花顺 它是所有德州扑克中的王牌,即使您经常玩扑克,也很少见到这样的牌。好比打高尔夫球一杆进洞一样。它是由T(10)到Ace的清一色同花组成。 | |
| | |
2
| Straight Flush同花顺 除了由最大同花所组成的同花大顺以外的同花组成的顺子。 | |
| | |
3
| Four-of-a-Kind 四条 四张同样的牌+任意一张牌 。 | |
| | |
4
| Full House 俘虏或船牌或葫芦 | |
| | |
5
| Flush 五张同花 用五张同一花色但不相连的牌型组成,如都是五张同花,则谁的同花牌大谁赢。 | |
| | |
6
| Straight五张顺子 由五张相连但不同花色的牌组成,在连牌中,Ace是既可作最大也可以作最小的牌。 | |
| | |
7
| Three-of-a-Kind三条 即三张同样的牌。它有两种叫法,取决于一对牌是在您手中还是在桌上。一对在手中,桌上有一张,称之为“set”;v如手中有一张,桌上有一对,则称之为“Threeof A Kind”。 | |
| | |
8
| Two Pair两对 由五张牌中的两对牌组成。如果都有两对,则先比大对,再比小对 。 | |
| | |
9
| One Pair一对 当不止一人有同样的一对牌时,则要比一对后面的牌,称之为“Kickers”。记住,德州扑克是挑选最好的五张牌去比。 | |
| | |
10
| High Card大牌 无以上任何牌型时,决定牌的大小 。 |
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<math.h>
int min,used[10],a[15][2];
char ch[9][20]={
"straight-flush",
"four-of-a-kind",
"full-house",
"flush",
"straight",
"three-of-a-kind",
"two-pairs",
"one-pair",
"highest-card"
};
void change(char *s,int x)
{
if(s[0]=='A') a[x][0]=1;
else if(isdigit(s[0])) a[x][0]=s[0]-'0';
else if(s[0]=='T') a[x][0]=10;
else if(s[0]=='J') a[x][0]=11;
else if(s[0]=='Q') a[x][0]=12;
else a[x][0]=13;
if(s[1]=='C') a[x][1]=1;
else if(s[1]=='D')a[x][1]=2;
else if(s[1]=='H')a[x][1]=3;
else a[x][1]=4;
}
void sort1(int *pp)
{
int i,j,temp;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
if(pp[i]>pp[j])
{
temp=pp[i];
pp[i]=pp[j];
pp[j]=temp;
}
}
}
int search(int *b)
{
int i,j,tt[5],count=0;
int num1=1,num2=1,temp=15,ok=1;
for(i=0;i<5;i++)
tt[count++]=a[b[i]][0];
sort1(tt);
if(a[b[0]][1]==a[b[1]][1]&&a[b[0]][1]==a[b[2]][1]&&a[b[0]][1]==a[b[3]][1]&&a[b[0]][1]==a[b[4]][1])
{
count=1;
if(tt[0]==1&&tt[1]==10)
return 0;
else
{
for(j=1;j<5;j++)
if(tt[j]-tt[j-1]!=1)
break;
else count++;
}
if(count==5) return 0;//第一种情况,返回下标
}
for(i=0;i<5;i++)
{
int num=1;
for(j=i+1;j<5;j++)
if(a[b[i]][0]==a[b[j]][0])
num++;
if(num==4) return 1;
}
num1=1;num2=1;temp=15;ok=1;
for(j=1;j<5;j++)
{
if(a[b[0]][0]==a[b[j]][0])
num1++;
else if(a[b[j]][0]==temp)
num2++;
else
{
if(ok)
{
temp=a[b[j]][0];
ok=0;
}
}
}
if((num1==3&&num2==2)||(num1==2&&num2==3)) return 2;
if(a[b[0]][1]==a[b[1]][1]&&a[b[0]][1]==a[b[2]][1]&&a[b[0]][1]==a[b[3]][1]&&a[b[0]][1]==a[b[4]][1])
return 3;
count=1;
if(tt[0]==1&&tt[1]==10)
return 4;
else
{
for(j=1;j<5;j++)
if(tt[j]-tt[j-1]!=1)
break;
else count++;
}
if(count==5) return 4;
for(i=2;i<5;i++)
{
if(tt[i]==tt[i-1]&&tt[i]==tt[i-2])
return 5;
}
count=0;
for(i=1;i<5;i++)
if(tt[i]==tt[i-1])
count++;
if(count==2) return 6;
count=0;
for(i=1;i<5;i++)
if(tt[i]==tt[i-1])
count++;
if(count==1) return 7;
return 8;
}
void dfs(int x)
{
int i,sum;
int num,A[10];
if(5==x)
{
num=0;
for(i=0;i<5;i++)
{
if(used[i])
A[num++]=i;
}
while(num!=5)
{
A[num++]=i;
i++;
}
sum=search(A);
if(sum<min)
min=sum;
return ;
}
used[x]=1;
dfs(x+1);
used[x]=0;
dfs(x+1);
}
main()
{
int i;
char str[15][5];
//freopen("D:\\ppp.txt","r",stdin);
while(scanf("%s",str[0])!=EOF)
{
printf("Hand: %s",str[0]);
change(str[0],0);
for(i=1;i<10;i++)
{
if(i==5) printf(" Deck:");
scanf("%s",str[i]);
printf(" %s",str[i]);
change(str[i],i);
}
min=10;
dfs(0);
printf(" Best hand: %s\n",ch[min]);
}
return 0;
}