ZOJ-1111
2014-07-10 00:05
405 查看
巨繁琐的模拟。。写了我近两小时,蛋疼死了,各种比较规则,代码很丑,困死了睡觉去鸟。。
#include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<map> #include<string> using namespace std; namespace { int value(char c) { if (c == 'T') return 10; else if (c == 'J') return 11; else if (c == 'Q') return 12; else if (c == 'K') return 13; else if (c == 'A') return 14; else return c - '0'; } bool cmp(const pair<int, char> &p1, const pair<int, char> &p2) { return p1.first > p2.first; } bool isStraight(vector<pair<int, char> > &cards) { int high = cards[0].first; return (cards[1].first == high - 1) && (cards[2].first == high - 2) && (cards[3].first == high - 3) && (cards[4].first == high - 4); } bool isFlush(vector<pair<int, char> > &cards) { return (cards[0].second == cards[1].second) && (cards[0].second == cards[2].second) && (cards[0].second == cards[3].second) && (cards[0].second == cards[4].second); } pair<string, pair<int, int> > type(vector<pair<int, char> > &cards) { int count[15]; memset(count, 0, sizeof(count)); for (size_t i = 0; i < cards.size(); i++) count[cards[i].first]++; bool four = false, three = false, pair = false, twopair = false; int first = 0, second = 0; for (int i = 2; i <= 14; i++) { if (count[i] == 4) { four = true; first = i; } if (count[i] == 3) { three = true; first = i; } if (count[i] == 2) { if (pair) { twopair = true; first = i; } else { pair = true; second = i; } } } bool straight = isStraight(cards); bool flush = isFlush(cards); string res; if (four) res = "Four"; else if (three && pair) res = "FullHouse"; else if (three) res = "Three"; else if (twopair) res = "TwoPairs"; else if (pair) res = "Pair"; else if (straight && !flush) res = "Straight"; else if (!straight && flush) res = "Flush"; else if (straight && flush) res = "SF"; else res = "HC"; if (res == "TwoPairs") return make_pair(res, make_pair(max(first, second), min(first, second))); else return make_pair(res, make_pair(first, second)); } int compareSameType(string &type, pair<int, int> &bv, pair<int, int> &wv, vector<pair<int, char> > &black, vector<pair<int, char> > &white) { if (type == "HC" || type == "Straight" || type == "Flush" || type == "SF") { for (size_t i = 0; i < black.size(); i++) if (black[i].first != white[i].first) return black[i].first - white[i].first; return 0; } else if (type == "Pair") { if (bv.first != wv.first) return bv.first - wv.first; else { vector<int> b, w; for (size_t i = 0; i < black.size(); i++) if (black[i].first != bv.first) b.push_back(black[i].first); for (size_t i = 0; i < white.size(); i++) if (white[i].first != wv.first) w.push_back(white[i].first); for (size_t i = 0; i < b.size(); i++) if (b[i] != w[i]) return b[i] - w[i]; return 0; } } else if (type == "TwoPairs") { if (bv.first != wv.first) return bv.first - wv.first; else if (bv.second != wv.second) return bv.second - wv.second; else { int bb, ww; for (size_t i = 0; i < black.size(); i++) if ((black[i].first != bv.first) && (black[i].first != bv.second)) bb = black[i].first; for (size_t i = 0; i < white.size(); i++) if ((white[i].first != wv.first) && (white[i].first != wv.second)) ww = white[i].first; return bb - ww; } } else if (type == "Three" || type == "Four" || type == "FullHouse") return bv.first - wv.first; return 0; } } int main() { char card[3]; vector<pair<int, char> > black; vector<pair<int, char> > white; map<string, int> mp; mp["HC"] = 1; mp["Pair"] = 2; mp["TwoPairs"] = 3; mp["Three"] = 4; mp["Straight"] = 5; mp["Flush"] = 6; mp["FullHouse"] = 7; mp["Four"] = 8; mp["SF"] = 9; while (scanf("%s", card) != EOF) { black.clear(); white.clear(); black.push_back(make_pair(value(card[0]), card[1])); for (int i = 1; i < 5; i++) { scanf("%s", card); black.push_back(make_pair(value(card[0]), card[1])); } for (int i = 0; i < 5; i++) { scanf("%s", card); white.push_back(make_pair(value(card[0]), card[1])); } sort(black.begin(), black.end(), cmp); sort(white.begin(), white.end(), cmp); pair<string, pair<int, int> > b = type(black); pair<string, pair<int, int> > w = type(white); if (b.first != w.first) puts(mp[b.first] > mp[w.first] ? "Black wins." : "White wins."); else { string s = b.first; int result = compareSameType(s, b.second, w.second, black, white); if (result > 0) puts("Black wins."); else if (result < 0) puts("White wins."); else puts("Tie."); } } return 0; }
相关文章推荐
- zoj 1111 Poker Hands
- ZOJ 1111 Poker Hands --复杂模拟
- zoj 1111 Poker Hands
- poj 1111||zoj 1047 Image Perimeters(dfs)
- ZOJ 1111 Poker Hands
- zoj 1111 Poker Hands
- ZOJ 1111 Poker Hands --复杂模拟
- ZOJ 1111 - Poker Hands 解题报告
- ZOJ 1111 &PE 54 oker hands(大模拟扑克)
- zoj 1047 || poj 1111 Image Perimeters(DFS water~)
- dijkstra ZOJ 2750 Idiomatic Phrases Game
- ZOJ-3758
- zoj 2158 Truck History
- ZOJ 3960What Kind of Friends Are You?
- ZOJ 2112 Dynamic Rankings
- ZOJ 1090 The Circumference of the Circle(计算三角形的外接圆)
- ZOJ 1002
- nyoj 1111 游戏人生(区间DP)
- ZOJ 3631 Watashi's BG
- zoj 3777