您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: