这题就是一个德州扑克的题目,主要是代码写的比较繁琐,可能我写的又繁琐了一点,
转化成十张牌之后然后枚举五的子集,然后从剩下五张牌,牌顶拿牌,这样操作一次,
让自己的牌最大,这里我比较牌的大小的时候排了一下序便于判断顺子和同花,
然后对子和炸弹什么的判断我写的稍微有些繁琐,不过我的思路是很简化的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<climits>
using namespace std;
const int N=1e6+10;
string s[10]={"straight-flush","four-of-a-kind","full-house","flush","straight","three-of-a-kind",
"two-pairs","one-pair","highest-card"};
struct node
{
int va;
char ch;
node() {};
};
node re[10];
int cmp(node a,node b)
{
if(a.va!=b.va)
return a.va<b.va;
else
return a.ch<b.ch;
}
int tnum(char ch)
{
if(isdigit(ch))
return ch-'0';
else
{
if(ch=='T')
return 10;
else if(ch=='J')
return 11;
else if(ch=='Q')
return 12;
else if(ch=='A')
return 1;
else
return 13;
}
}
int work(node *s)
{
int tem1=0;
int tem2=0;
int i;
for(i=0;i<4;i++)
{
if(s[i].va+1!=s[i+1].va)
{
break;
}
}
if(i==4)
tem1=1;
if(s[0].va==1&&s[1].va==10&&s[2].va==11&&s[3].va==12&&s[4].va==13)
tem1=1;
for(i=0;i<4;i++)
if(s[i].ch!=s[i+1].ch)
break;
if(i==4)
tem2=1;
if(tem1&&tem2)
return 0;
if((s[0].va==s[1].va&&s[1].va==s[2].va&&s[2].va==s[3].va)||
(s[1].va==s[2].va&&s[2].va==s[3].va&&s[3].va==s[4].va))
return 1;
if((s[0].va==s[1].va&&s[1].va==s[2].va&&s[3].va==s[4].va)||(s[0].va==s[1].va&&s[2].va
==s[3].va&&s[3].va==s[4].va))
return 2;
if(tem2)
return 3;
if(tem1)
return 4;
if((s[0].va==s[1].va&&s[1].va==s[2].va)||(s[1].va==s[2].va&&s[2].va==s[3].va)||
(s[2].va==s[3].va&&s[3].va==s[4].va))
return 5;
if((s[0].va==s[1].va&&s[2].va==s[3].va)||(s[0].va==s[1].va&&s[3].va==s[4].va)||(s[1].va
==s[2].va&&s[3].va==s[4].va))
return 6;
if((s[0].va==s[1].va)||(s[1].va==s[2].va)||(s[2].va==s[3].va)||(s[3].va==s[4].va))
return 7;
return 8;
}
int pset()
{
node tem[5];
int Min=20;
for(int i=0;i<(1<<5);i++)
{
memcpy(tem,re,sizeof(tem));
int tl=5;
for(int j=0;j<5;j++)
{
if(i&(1<<j))
{
tem[j].va=re[tl].va;
tem[j].ch=re[tl].ch;
tl++;
}
}
sort(tem,tem+5,cmp);
int vis=work(tem);
Min=min(Min,vis);
}
return Min;
}
char tch(int num)
{
if(num>1&&num<10)
return ('0'+num);
else
{
if(num==10)
return 'T';
else if(num==11)
return 'J';
else if(num==12)
return 'Q';
else if(num==1)
return 'A';
else
return 'K';
}
}
int main()
{
string ss;
while(getline(cin,ss))
{
int len=0;
for(int i=0;i<ss.length();i++)
{
if(ss[i]!=' ')
{
re[len].va=tnum(ss[i]);
re[len].ch=ss[i+1];
len++;
i++;
}
}
int val=pset();
printf("Hand: ");
for(int i=0;i<5;i++)
{
printf("%c%c ",tch(re[i].va),re[i].ch);
}
printf("Deck: ");
for(int i=5;i<10;i++)
{
printf("%c%c ",tch(re[i].va),re[i].ch);
}
printf("Best hand: ");
cout<<s[val]<<endl;
}
return 0;
}