[uva] 131 - The Psychic Poker Player
不会打扑克的人伤不起, 实际上就是子集生成 + 各种规则模拟. 规则中几个要注意的点:
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 }