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;}

原创粉丝点击