第一次提交超时(Time limit exceeded )了,想了半天不知道哪里能再简化。原来是主函数中写了while(1)循环,怪不得会超时,要写成while(cin>>ch)就好了。
这个题不难,考察细致程度,当然要读懂题目,开始不明白输出那是些什么东西,查了度娘后明白了,现在把扑克规则粘贴过来供大家参考。
下面列出从大到小的扑克牌面. 这是所有的扑克通用规则。
1
| Royal Flush 同花大顺又称皇家同花顺 它是所有德州扑克中的王牌,即使您经常玩扑克,也很少见到这样的牌。好比打高尔夫球一杆进洞一样。它是由T(10)到Ace的清一色同花组成。 | |
| | |
2
| Straight Flush 同花顺 除了由最大同花所组成的同花大顺以外的同花组成的顺子。 | |
| | |
3
| Four-of-a-Kind 四条 四张同样的牌+任意一张牌 。 | |
| | |
4
|
Full House 俘虏或船牌或葫芦 三条带一对,即三张同样的牌带两张同样的牌。如都是Full House,则先比较谁的三条大,如三条一样大,则比谁的两对大。如: | |
| | |
5
| Flush 五张同花 用五张同一花色但不相连的牌型组成,如都是五张同花,则谁的同花牌大谁赢。 | |
| | |
6
| Straight 五张顺子 由五张相连但不同花色的牌组成,在连牌中,Ace是既可作最大也可以作最小的牌。 | |
| | |
7
| Three-of-a-Kind 三条 即三张同样的牌。它有两种叫法,取决于一对牌是在您手中还是在桌上。一对在手中,桌上有一张,称之为“set”;v如手中有一张,桌上有一对,则称之为“Three of A Kind”。 | |
| | |
8
| Two Pair 两对 由五张牌中的两对牌组成。如果都有两对,则先比大对,再比小对 。 | |
| | |
9
| One Pair 一对 当不止一人有同样的一对牌时,则要比一对后面的牌,称之为“Kickers”。记住,德州扑克是挑选最好的五张牌去比。 | |
| | |
10
| High Card 大牌 无以上任何牌型时,决定牌的大小 。 |
判断完后根据从大到小的顺序依次判断牌型符合哪种要求输出即可。
哦对了,还是用到了位向量法生成子集。
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
struct card
{
char value,suit;
};
card input[10];
char besthand[9][20]={"straight-flush","four-of-a-kind","full-house", "flush","straight","three-of-a-kind","two-pairs","one-pair","highest-card"};
int Min;
int cmp(const void* a,const void* b)
{
return *(int*)a-*(int*)b;
}
int cmp2(const void* a,const void* b)
{
return *(int*)b-*(int*)a;
}
int getpairs(int cd[])
{
int pile[14]={0};
for (int i=0;i<5;i++)
pile[cd[i]]++;
qsort(pile,14,sizeof(pile[0]),cmp2);
if (pile[0]==4) return 5;
else if (pile[0]==3&&pile[1]==2) return 4;
else if (pile[0]==3) return 3;
else if (pile[0]==2&&pile[1]==2) return 2;
else if (pile[0]==2) return 1;
else return 0;
}
int classify(card cd[])
{
bool flush=1,strat=1;
char suit=cd[0].suit;
int cdv[5],pairs;
for (int i=0;i<5;i++)
{
if (cd[i].value=='A') cdv[i]=1;
else if (cd[i].value=='T') cdv[i]=10;
else if (cd[i].value=='J') cdv[i]=11;
else if (cd[i].value=='Q') cdv[i]=12;
else if (cd[i].value=='K') cdv[i]=13;
else cdv[i]=cd[i].value-'0';
if (suit!=cd[i].suit)
flush=0;
}
qsort(cdv,5,sizeof(cdv[0]),cmp);
if (cdv[0]>1&&cdv[0]<10)
{
for (int i=1;i<5;i++)
{
if (cdv[i]-cdv[0]!=i)
{
strat=0;
break;
}
}
}
else if (cdv[0]==1)
{
if (cdv[1]==2&&cdv[2]==3&&cdv[3]==4&&cdv[4]==5)
strat=1;
else if (cdv[1]==10&&cdv[2]==11&&cdv[3]==12&&cdv[4]==13)
strat=1;
else strat=0;
}
else strat=0;
pairs=getpairs(cdv);
if (flush&&strat) return 0;
else if (pairs==5) return 1;
else if (pairs==4) return 2;
else if (flush) return 3;
else if (strat) return 4;
else if (pairs==3) return 5;
else if (pairs==2) return 6;
else if (pairs==1) return 7;
else return 8;
}
void subset(int n,int B[],int cur)
{
if (cur==n)
{
int dex=0;
card cd[5];
for (int i=0;i<cur;i++)
{
if (B[i])
cd[dex++]=input[i];
}
for (int j=dex,k=5;j<5;j++)
{
cd[j]=input[k++];
}
int tmp=classify(cd);
if (tmp<Min) Min=tmp;
return ;
}
B[cur]=1;
subset(n,B,cur+1);
B[cur]=0;
subset(n,B,cur+1);
}
void print()
{
cout<<"Hand: ";
for (int i=0;i<5;i++)
{
cout<<input[i].value<<input[i].suit<<" ";
}
cout<<"Deck: ";
for (int i=5;i<10;i++)
{
cout<<input[i].value<<input[i].suit<<" ";
}
cout<<"Best hand: "<<besthand[Min]<<endl;
}
int main()
{
char chv,chs;
while (cin>>chv>>chs)
{
input[0].value=chv;
input[0].suit=chs;
getchar();
for (int i=1;i<10;i++)
{
cin>>input[i].value>>input[i].suit;
getchar();
}
int array[5];
Min=8;
subset(5,array,0);
print();
}
return 0;
}