UVA 131 The Psychic Poker Player
题目大意:手牌五张 排堆五张,超能力者可以看到这10张牌,可以弃掉x张牌摸x张牌,问能凑出的最大的牌
比较规则
比较规则如下:(按优先级排序)
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:大牌,没有以上牌型。
解题思路:二进制法求子集,并选出子集最大的牌
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
char str[20][10];
int map1[14];
int mi;
int map2[4];
char pu[9][20] = {"straight-flush", "four-of-a-kind", "full-house", "flush", "straight", "three-of-a-kind", "two-pairs", "one-pair", "highest-card"};
int turn1(int a) {
if(str[a][0] == 'T')
return 9;
if(str[a][0] == 'J')
return 10;
if(str[a][0] == 'Q')
return 11;
if(str[a][0] == 'K')
return 12;
if(str[a][0] == 'A')
return 0;
return str[a][0] - '0' - 1;
}
int turn2(int a) {
if(str[a][1] == 'C')
return 0;
if(str[a][1] == 'D')
return 1;
if(str[a][1] == 'H')
return 2;
if(str[a][1] == 'S')
return 3;
return 4;
}
int count() {
if(map1[0] && map1[9] && map1[10] && map1[11] && map1[12])
return 0;
int p = 0, q = 0;
for(int i = 0; i < 13; i++) {
if(map1[i] == 4)
return 1;
else if(map1[i] == 3)
p++;
else if(map1[i] == 2)
q++;
}
if(p == 1 && q == 1)
return 2;
for(int i = 0; i < 4; i++)
if(map2[i] == 5)
return 3;
if(p == 0 && q == 0) {
for(int i = 0; i < 13; i++) {
if(i + 4 <= 13 && map1[i] && map1[i+1] && map1[i+2] && map1[i+3] && map1[i+4])
return 4;
}
}
if(p == 1)
return 5;
if(q == 2)
return 6;
if(q ==1)
return 7;
return 8;
}
void son(int a) {
int b = 5;
memset(map1, 0, sizeof(map1));
memset(map2, 0, sizeof(map2));
for(int i = 0; i < 5; i++) {
if(a & (1 << i)) {
b--;
map1[turn1(i)]++;
map2[turn2(i)]++;
}
}
map1[13] = map1[0];
for(int i = 0; i < b; i++) {
map1[turn1(5+i)]++;
map2[turn2(5+i)]++;
}
}
void solve() {
mi = 9;
for(int i = 0; i < (1<<5); i++) {
son(i);
int re;
re = count();
if(re < mi)
mi = re;
}
puts(pu[mi]);
}
int main() {
while(scanf("%s", str[0]) != EOF) {
for(int i = 1; i < 10; i++)
scanf("%s", str[i]);
printf("Hand: ");
for(int i = 0; i < 5; i++)
printf("%c%c ", str[i][0], str[i][1]);
printf("Deck: ");
for(int i = 5; i < 10; i++)
printf("%c%c ", str[i][0], str[i][1]);
printf("Best hand: ");
solve();
}
return 0;
}