[uva] 131 - The Psychic Poker Player

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=107&page=show_problem&problem=67

不会打扑克的人伤不起, 实际上就是子集生成 + 各种规则模拟. 规则中几个要注意的点:

A是最大的牌, 也可以是最小的牌, 也就是顺子的情况有可能是TJQKA, 也可能是A2345.

这道题一开始题意也没读懂, 我以为玩家只能看透最上面的一张牌, 那样的话题目就是用贪心来解了.

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <algorithm>
  5 using namespace std;
  6 
  7 static string pockersTypeArr[9] = {"straight-flush", "four-of-a-kind", "full-house", "flush",
  8     "straight", "three-of-a-kind", "two-pairs", "one-pair", "highest-card"};
  9 static string pockerValues = "23456789TJQKA";
 10 static int valueIndexArr[127] = {0};
 11 enum EPockersType{
 12     STRAIGHT_FLUSH  = 0,
 13     FOUR_OF_A_KIND  = 1,
 14     FULL_HOURSE     = 2,
 15     FLUSH            = 3,
 16     STRAIGHT        = 4,
 17     THREE_OF_A_KIND = 5,
 18     TWO_PAIRS        = 6,
 19     ONE_PAIR        = 7,
 20     HIGHEST_CARD    = 8,
 21 };
 22 
 23 typedef struct _Poker {
 24     char value;
 25     char suit;
 26 }Poker;
 27 
 28 vector<Poker> hand;
 29 vector<Poker> deck;
 30 
 31 bool Less(const Poker& first, const Poker& second) {
 32     return valueIndexArr[first.value] < valueIndexArr[second.value];
 33 }
 34 int judgePockers(vector<Poker>& pockers) {
 35     sort(pockers.begin(), pockers.end(), Less);
 36     bool straightFlag = true;
 37     bool flushFlag = true;
 38     for (unsigned int i = 1; i < pockers.size(); ++i) {
 39         if (valueIndexArr[pockers[i].value] - valueIndexArr[pockers[i - 1].value] != 1) {
 40             straightFlag = false;
 41         }
 42         if (pockers[i].suit != pockers[i - 1].suit) {
 43             flushFlag = false;
 44         }
 45     }
 46     if (pockers[0].value == '2' && pockers[1].value == '3' &&
 47         pockers[2].value == '4' && pockers[3].value == '5' && pockers[4].value == 'A') {
 48         straightFlag = true;
 49     }
 50     if (straightFlag && flushFlag) {
 51         return STRAIGHT_FLUSH;
 52     } else if (straightFlag && !flushFlag) {
 53         return STRAIGHT;
 54     } else if (!straightFlag && flushFlag) {
 55         return FLUSH;
 56     }
 57     int sameNumArr[13] = {0};
 58     for (unsigned int i = 0; i < pockerValues.size(); ++i) {
 59         int sameNum = 0;
 60         for (unsigned int j = 0; j < pockers.size(); ++j) {
 61             if (pockerValues[i] == pockers[j].value) {
 62                 sameNum += 1;
 63             }
 64         }
 65         int index = valueIndexArr[(unsigned int)pockerValues[i]];
 66         sameNumArr[index] = sameNum;
 67     }
 68     bool threeFlag = false;
 69     int twoPairNum = 0;
 70     for (int i = 0; i < 13; ++i) {
 71         if (sameNumArr[i] == 4) {
 72             return FOUR_OF_A_KIND;
 73         }
 74         if (sameNumArr[i] == 3) {
 75             threeFlag = true;
 76         }
 77         if (sameNumArr[i] == 2) {
 78             twoPairNum += 1;
 79         }
 80     }
 81     if (threeFlag && twoPairNum == 1) {
 82         return FULL_HOURSE;
 83     } else if (threeFlag && !twoPairNum) {
 84         return THREE_OF_A_KIND;
 85     } else if (!threeFlag && twoPairNum == 2) {
 86         return TWO_PAIRS;
 87     } else if (!threeFlag && twoPairNum == 1) {
 88         return ONE_PAIR;
 89     } else {
 90         return HIGHEST_CARD;
 91     }
 92     return -1;
 93 }
 94 
 95 void outPut(const string& initial, const string& bestHand) {
 96     string hand = initial.substr(0, 15);
 97     string deck = initial.substr(15, 15);
 98     cout<<"Hand: "<<hand<<"Deck: "<<deck<<" "<<"Best hand: "<<bestHand<<endl;
 99 }
100 
101 void init() {
102     for (unsigned int i = 0; i < pockerValues.size(); ++i) {
103         valueIndexArr[(unsigned int)(pockerValues[i])] = i;
104     }
105 }
106 
107 int main(int argc, const char * argv[])
108 {
109     init();
110     string line;
111     while (getline(cin, line)) {
112         hand.clear();
113         deck.clear();
114         for (int i = 0; i <= 27 ; i += 3) {
115             Poker poker;
116             poker.value = line[i];
117             poker.suit = line[i + 1];
118             if (i < 15) {
119                 hand.push_back(poker);
120             } else {
121                 deck.push_back(poker);
122             }
123         }
124         
125         vector<Poker> bestPockers(hand);
126         int bestHandType = 0;
127         for (int i = 1; i < (1 << 5); ++i) {
128             int deckIndex = 0;
129             vector<Poker> out(hand);
130             for (int j = 0; j < 5; ++j) if ((i >> j) & 0x0001) {
131                 out[j] = deck[deckIndex++];
132             }
133             int outType = judgePockers(out);
134             int bestType = judgePockers(bestPockers);
135             if (outType == -1 || bestType == -1) {
136                 //printf("error type\n");
137                 break;
138             }
139             bestHandType = outType >= bestType ? bestType : ((bestPockers = out), outType);
140         }
141         outPut(line, pockersTypeArr[bestHandType]);
142     }
143     return 0;
144 }

 

posted @ 2013-12-02 23:22  NextLife  阅读(393)  评论(0)    收藏  举报