ZOJ-1111

来源:互联网 发布:js base64转换为文件 编辑:程序博客网 时间:2024/06/06 06:45
巨繁琐的模拟。。写了我近两小时,蛋疼死了,各种比较规则,代码很丑,困死了睡觉去鸟。。
#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;elsereturn 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";elseres = "HC";if (res == "TwoPairs")return make_pair(res,make_pair(max(first, second), min(first, second)));elsereturn 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.");elseputs("Tie.");}}return 0;}

0 0