/*
A 2 3 4 5 是顺子, T J Q K A也是顺子
1. straight-flush 同花顺
2. four-of-a-kind 四张
3. full-house 3+2
4. flush 同花
5. straight 顺子
6. three-of-a-kind 3张
7. two-pairs 2对
8. one-pair 1对
9. highest-card 什么都不是,比较最大牌
*/
#include <cstdio>
#include <cstring>
using namespace std;
char result[][20] =
{
"straight-flush",
"four-of-a-kind",
"full-house",
"flush",
"straight",
"three-of-a-kind",
"two-pairs",
"one-pair",
"highest-card"
};
/*
hand[i][0]:value, hand[i][1]:suit
Spades:0, hearts:1, Diamonds:2, Clubs:3
*/
int hand[5][2];
int deck[5][2];
int temp[5][2];
int max_value;
//poker转换成int型
int get_val(char c)
{
switch(c)
{
case 'A': return 1;
case 'T': return 10;
case 'J': return 11;
case 'Q': return 12;
case 'K': return 13;
default: return c-'0';
}
return -1;
}
//suit转换为int型
int get_suit(char c)
{
switch(c)
{
case 'S': return 0;
case 'H': return 1;
case 'D': return 2;
case 'C': return 3;
}
return -1;
}
//转换程序
void set_poker(int pokers[][2], int i, char *buff)
{
pokers[i][0] = get_val(buff[0]);
pokers[i][1] = get_suit(buff[1]);
}
//枚举生成的牌
void set_temp(int model)
{
int cnt=0;
for(int i=0; i<5; i++) {
if(model & (1<<i)) { // 1 replace
temp[i][0] = deck[cnt][0];
temp[i][1] = deck[cnt++][1];
} else {
temp[i][0] = hand[i][0];
temp[i][1] = hand[i][1];
}
}
}
//是否为顺子
int is_straight(int value[])
{
value[14] = value[1]; //A即当成14和1
int cnt = 0;
int found = 0;
for(int i=1; i<15; i++) {
if(!value[i]) cnt = 0;
else {
cnt++;
if(cnt == 5) {
found = 1;
break;
}
}
}
return found;
}
//是否为同花
int is_flush(int suit[])
{
for(int i=0; i<4; i++) {
if(suit[i] == 5) return 1;
}
return 0;
}
//m1:最大同张个数, m2:第二大同张个数
void get_pair(int value[], int &m1, int &m2)
{
m1 = m2 = 1;
for(int i=1; i<14; i++) {
if(value[i] > m1) {
m2 = m1;
m1 = value[i];
} else if(value[i] > m2){
m2 = value[i];
}
}
}
//获得当前牌的最大值
int get_val()
{
int value[15] = {0}; //value[1] - value[13]
int suit[4] = {0}; // start from 0
for(int i=0; i<5; i++) {
value[temp[i][0]]++;
suit[temp[i][1]]++;
}
int straight = is_straight(value);
int flush = is_flush(suit);
int m1, m2;
get_pair(value, m1, m2);
if(straight && flush) return 0;
else if(m1 == 4) return 1;
else if(m1==3 && m2==2) return 2;
else if(flush) return 3;
else if(straight) return 4;
else if(m1==3) return 5;
else if(m1==2 && m2==2) return 6;
else if(m1==2 && m2==1) return 7;
else return 8;
}
//枚举生成可能的牌
int solve()
{
int val = 8;
for(int i=0; i<(1<<5); i++) {
set_temp(i);
int t = get_val();
if(t < val) val = t;
}
return val;
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
char buff[3];
while(scanf("%s", buff) == 1) {
printf("Hand: %s ", buff);
for(int i=0; i<5; i++) {
set_poker(hand, i, buff);
if(i!=4) {
scanf("%s", buff);
printf("%s ", buff);
}
}
printf("Deck: ");
for(int i=0; i<5; i++) {
scanf("%s", buff);
printf("%s ", buff);
set_poker(deck, i, buff);
}
int val = solve();
printf("Best hand: %s\n", result[val]);
}
return 0;
}
UVa 131 - The Psychic Poker Player
最新推荐文章于 2020-09-13 06:26:34 发布