UVa 131 - The Psychic Poker Player
来源:互联网 发布:招聘程序员的工作要求 编辑:程序博客网 时间:2024/05/17 09:38
/* 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]:suitSpades: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;}