难点:题意的理解
其实就是德州扑克的玩法。抽5张牌,然后留5张在桌面,可以选择丢弃1张牌,然后从桌面抽1张,从桌面抽的不能丢弃。最多丢弃五张牌,也就是把桌上留着的5张牌全拿上。
5张牌的大小比较:
1.straight-flush:同花顺。牌面为T(10) - A,这里不论花色是否同样;
2.four-of-a-kind:四条,牌面有4个同样的值。
3.full-house:船牌,牌面有3个同样值,剩下2个也同样值。
4.flush:同花,五张牌的花色同样,不是同花顺;
5.straight:顺子。五张牌的值连续,A能够作为1也能够作为14;
6.three-of-a-kind:三条,牌面有3个同样的值;
7.two-pairs:两对。牌面有2个对子。
8.one-pair:一对,牌面有一个对子,即2个同值;
9.highest-card:大牌,没有以上牌型。
由于数据量很小,5张牌,所以递归肯定不会超时。
AC 0MS
#include <iostream>
#include<string>
#include<algorithm>
#include<ctype.h>
#include<string.h>
using namespace std;
string hand[5], deck[5], changehand[5];
int c[5], ans = 8;
char ch[9][20] =
{
"straight-flush",
"four-of-a-kind",
"full-house",
"flush",
"straight",
"three-of-a-kind",
"two-pairs",
"one-pair",
"highest-card"
};
int judge(int cur)
{
char value[5], kind[5];
for (int i = 0; i < 5; i++)
changehand[i] = hand[i];
for (int i = 0; i < cur; i++)
changehand[c[i]] = deck[i];
for (int i = 0; i < 5; i++)
{
value[i] = changehand[i][0];
if (value[i] == 'T')
value[i] = ':';
if (value[i] == 'J')
value[i] = ';';
if (value[i] == 'Q')
value[i] = '<';
if (value[i] == 'K')
value[i] = '=';
if (value[i] == 'A')
value[i] = '1';
kind[i] = changehand[i][1];
}
sort(value, value + 5);
int vis[5], t[5];
memset(vis, 0, sizeof(vis));
memset(t, 0, sizeof(t));
for (int i = 0; i < 5; i++)
{
if (vis[i])
{
t[i] = t[vis[i] - 1];
continue;
}
vis[i] = i + 1;
for (int j = i; j < 5; j++)
{
if (value[i] == value[j])
{
vis[j] = vis[i];
t[i]++;
}
}
}
if (value[0] == '1' && value[1] == ':' && value[2] == ';' && value[3] == '<' && value[4] == '=')
return 0;
if (count(t, t + 5, 4) > 0 || count(t, t + 5, 5) > 0)
return 1;
if (count(t, t + 5, 3) == 3 && count(t, t + 5, 2) == 2)
return 2;
if (kind[0] == kind[1] && kind[1] == kind[2] && kind[2] == kind[3] && kind[3] == kind[4])
return 3;
if (value[0] == value[1] - 1 && value[0] == value[2] - 2 && value[0] == value[3] - 3 && value[0] == value[4] - 4)
return 4;
if (count(t, t + 5, 3) > 0)
return 5;
if (count(t, t + 5, 2) == 4)
return 6;
if (count(t, t + 5, 2) == 2)
return 7;
return 8;
}
int dfs(int cur)
{
int i, j;
if (ans > judge(cur))
ans = judge(cur);
if (cur == 5)
return 0;
for (i = 0; i < 5; i++)
{
int ok = 1;
c[cur] = i;
for (j = 0; j < cur; j++)
{
if (c[j] >= i)
{
ok = 0;
break;
}
}
if (ok)
dfs(cur + 1);
}
return 0;
}
int main()
{
string a[2];
a[0] = 'a';
a[1] = 'b';
while (cin>>hand[0])
{
for (int i = 1; i < 5; i++)
cin >> hand[i];
for (int i = 0; i < 5; i++)
cin >> deck[i];
dfs(0);
cout << "Hand: ";
for (int i = 0; i < 5; i++)
cout << hand[i] << " ";
cout << "Deck: ";
for (int i = 0; i < 5; i++)
cout << deck[i] << " ";
cout << "Best hand: " << ch[ans] << endl;
memset(c, 0, sizeof(c));
ans = 8;
}
}