您的位置:首页 > 其它

programming-challenges Poker Hands (110202) 题解

2015-06-15 09:01 393 查看
是一道比细心的题目。不过第一次写时犯了很愚蠢的错误,每种规则的比较时假如只有一方满足要求,则该方已经胜出。而我第一次写时要求双方都满足该规则才会进行比较。今后对这种愚蠢的错误要慢慢积累,尽量不犯。

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <assert.h>
#include <algorithm>
#include <math.h>
#include <ctime>
#include <functional>
#include <string.h>
#include <stdio.h>
#include <numeric>
#include <float.h>

using namespace std;

struct Poker {
char suite;
int value;
};
bool operator<(Poker p1, Poker p2) {
return p1.value < p2.value;
}

bool sameSuite(vector<Poker> v) {
for (int i = 1; i < v.size(); i++)
if (v[i].suite != v[0].suite) return false;
return true;
}

int maxPoker(vector<Poker> v1, vector<Poker> v2) {
for (int i = v1.size() - 1; i >= 0; i--) {
if (v1[i].value > v2[i].value) return -1;
else if (v1[i].value < v2[i].value) return 1;
}

return 0;
}

int f8(vector<Poker> v1, vector<Poker> v2) {
int i1 = -1, i2 = -1;

if (sameSuite(v1)) {
if (v1[4].value - v1[0].value == 4) {
i1 = v1[4].value;
}
}

if (sameSuite(v2)) {
if (v2[4].value - v2[0].value == 4) {
i2 = v2[4].value;
}
}

if (i1 > i2) return -1;
else if (i1 < i2) return 1;

return 0;
}

int f7(vector<Poker> v1, vector<Poker> v2) {
int i1 = -1, i2 = -1;

if (v1[3].value == v1[0].value) i1 = v1[3].value;
if (v2[3].value == v2[0].value) i2 = v2[3].value;

if (i1 > i2) return -1;
else if (i1 < i2) return 1;

return 0;
}

int f6(vector<Poker> v1, vector<Poker> v2) {
int i1 = -1, i2 = -1;

if (v1[1].value == v1[0].value && v1[4].value == v1[2].value) i1 = v1[2].value;
if (v1[2].value == v1[0].value && v1[4].value == v1[3].value) i1 = v1[0].value;

if (v2[1].value == v2[0].value && v2[4].value == v2[2].value) i2 = v2[2].value;
if (v2[2].value == v2[0].value && v2[4].value == v2[3].value) i2 = v2[0].value;

if (i1 > i2) return -1;
else if (i1 < i2) return 1;

return 0;
}

int f5(vector<Poker> v1, vector<Poker> v2) {
if (sameSuite(v1) && sameSuite(v2)) {
return maxPoker(v1, v2);
}
else if (sameSuite(v1)) return -1;
else if (sameSuite(v2)) return 1;
return 0;
}

int f4(vector<Poker> v1, vector<Poker> v2) {
int i1 = -1, i2 = -1;

if (v1[4].value - v1[0].value == 4) i1 = v1[0].value;
if (v2[4].value - v2[0].value == 4) i2 = v2[0].value;

if (i1 > i2) return -1;
else if (i1 < i2) return 1;
return 0;
}

int f3(vector<Poker> v1, vector<Poker> v2) {
int i1 = -1, i2 = -1;

if (v1[2].value == v1[0].value) i1 = v1[0].value;
if (v1[2].value == v1[4].value) i1 = v1[2].value;
if (v2[2].value == v2[0].value) i2 = v2[0].value;
if (v2[2].value == v2[4].value) i2 = v2[2].value;

if (i1 > i2) return -1;
else if (i1 < i2) return 1;

return 0;
}

int f2(vector<Poker> v1, vector<Poker> v2) {
int pos = 0;
vector<Poker> tv1, tv2, val1, val2;

while (pos < v1.size()) {
if (pos == v1.size() - 1) {
tv1.push_back(v1[pos]); pos += 1;
}
else if (v1[pos].value != v1[pos + 1].value) {
tv1.push_back(v1[pos]); pos += 1;
}
else {
val1.push_back(v1[pos]);
pos += 2;
}
}

pos = 0;
while (pos < v2.size()) {
if (pos == v2.size() - 1) {
tv2.push_back(v2[pos]); pos += 1;
}
else if (v2[pos].value != v2[pos + 1].value) {
tv2.push_back(v2[pos]); pos += 1;
}
else {
val2.push_back(v2[pos]);
pos += 2;
}
}

int r = 0;
if (val1.size() == 2 && val2.size() == 2) {
r = maxPoker(val1, val2);
if (r == 0)
r = maxPoker(tv1, tv2);
return r;
}
else if (val1.size() == 2) {
return -1;
}
else if (val2.size() == 2) {
return 1;
}

return 0;
}

int f1(vector<Poker> v1, vector<Poker> v2) {
int pos = 0;
vector<Poker> tv1, tv2, val1, val2;

while (pos < v1.size()) {
if (pos == v1.size() - 1) {
tv1.push_back(v1[pos]); pos += 1;
}
else if (v1[pos].value != v1[pos + 1].value) {
tv1.push_back(v1[pos]); pos += 1;
}
else {
val1.push_back(v1[pos]);
pos += 2;
}
}

pos = 0;
while (pos < v2.size()) {
if (pos == v2.size() - 1) {
tv2.push_back(v2[pos]); pos += 1;
}
else if (v2[pos].value != v2[pos + 1].value) {
tv2.push_back(v2[pos]); pos += 1;
}
else {
val2.push_back(v2[pos]);
pos += 2;
}
}

int r = 0;
if (val1.size() == 1 && val2.size() == 1) {
r = maxPoker(val1, val2);
if (r == 0)
r = maxPoker(tv1, tv2);
return r;
}
else if (val1.size() == 1) {
return -1;
}
else if (val2.size() == 1) {
return 1;
}

return 0;
}

Poker parse(string s) {
Poker result;
result.suite = s[1];
if (s[0] == 'T') result.value = 10;
else if (s[0] == 'J') result.value = 11;
else if (s[0] == 'Q') result.value = 12;
else if (s[0] == 'K') result.value = 13;
else if (s[0] == 'A') result.value = 14;
else result.value = s[0] - '0';

return result;
}

int check(vector<Poker> v1, vector<Poker> v2) {
if (f8(v1, v2) != 0) return f8(v1, v2);
if (f7(v1, v2) != 0) return f7(v1, v2);
if (f6(v1, v2) != 0) return f6(v1, v2);
if (f5(v1, v2) != 0) return f5(v1, v2);
if (f4(v1, v2) != 0) return f4(v1, v2);
if (f3(v1, v2) != 0) return f3(v1, v2);
if (f2(v1, v2) != 0) return f2(v1, v2);
if (f1(v1, v2) != 0) return f1(v1, v2);
return maxPoker(v1, v2);
}

int main() {
string s;

while (cin >> s) {
vector<Poker> v1, v2;
v1.push_back(parse(s));

for (int i = 1; i <= 4; i++) {
cin >> s; v1.push_back(parse(s));
}

for (int i = 0; i <= 4; i++) {
cin >> s; v2.push_back(parse(s));
}

sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());

int r = check(v1, v2);
if (r == -1) cout << "Black wins." << endl;
else if (r == 1) cout << "White wins." << endl;
else cout << "Tie." << endl;
}

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