当前位置: 代码迷 >> 综合 >> Project Euler problem 54
  详细解决方案

Project Euler problem 54

热度:64   发布时间:2024-01-13 17:35:41.0


一道有点复杂的模拟题吧。。 也不算难写 细节上注意一下就行了。。

首先就是判断rank。 这个还是好判断的。

如果rank一样就要把每个人手中的牌按优先级排列一下,两人按顺序比较

这个优先级,说例子吧。 假如是两个对儿的。  优先比较的肯定是大的那个对儿,然后是小的那个对儿,再然后是那个单张的

再说一个 有一对儿还有三张一样的。 优先比较的是三张的,再比较一对儿的

再一个例子,就有一个对儿的, 先比较的是对儿,然后剩下的牌肯定是优先比较大的。

另外,加入说是顺子的话,只用比较最大的那个就行了。

但是同花的,就得从大到小比较5张牌了。

我的意思就是对与那种 顺子,对儿,三张, 四张, 都可以用一张牌代替去比较。然后剩下的牌按优先级别比较。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <cmath>
#include <set>
#include <vector>
#define eps 1e-6
#define INF 1000000007
#define PI acos(-1.0)
using namespace std;
struct node
{string s[5];int rk;vector<int>g;
}p1, p2;
int v[333];
bool cmp(string s1, string s2)
{if(s1[0] != s2[0])return v[s1[0]] < v[s2[0]];return v[s1[1]] < v[s2[1]];
}
bool HighCard(node &p)
{for(int i = 4; i >= 0; i--)p.g.push_back(v[p.s[i][0]]);return 1;
}
bool OnePair(node &p)
{int num[15];memset(num, 0, sizeof(num));int a[5];int k = 0;for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]];for(int i = 0; i < 5; i++) num[a[i]]++;for(int i = 2; i <= 14; i++)if(num[i] == 2) k++;if(k == 1){for(int i = 14; i >= 2; i--)if(num[i] == 2) p.g.push_back(i);for(int i = 14; i >= 2; i--)if(num[i] == 1) p.g.push_back(i);return 1;}return 0;
}
bool TwoPairs(node &p)
{int num[15];memset(num, 0, sizeof(num));int a[5];int k = 0;for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]];for(int i = 0; i < 5; i++) num[a[i]]++;for(int i = 2; i <= 14; i++)if(num[i] == 2) k++;if(k == 2){for(int i = 14; i >= 2; i--)if(num[i] == 2) p.g.push_back(i);for(int i = 2; i <= 14; i++)if(num[i] == 1) p.g.push_back(i);return 1;}return 0;
}
bool ThreeofaKind(node &p)
{int num[15];memset(num, 0, sizeof(num));int a[5];for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]];for(int i = 0; i < 5; i++) num[a[i]]++;int flag = 0;for(int i = 2; i <= 14; i++)if(num[i] == 3) flag = 1;if(flag){for(int i = 2; i <= 14; i++)if(num[i] == 3) p.g.push_back(i);for(int i = 14; i >= 2; i--)if(num[i] == 1) p.g.push_back(i);return 1;}return 0;
}
bool Straight(node &p)
{int a[5];for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]];for(int i = 1; i < 5; i++)if(a[i] != a[i - 1] + 1) return 0;p.g.push_back(v[p.s[4][0]]);return 1;
}
bool Flush(node &p)
{int a[5];for(int i = 0; i < 5; i++) a[i] = v[p.s[i][1]];for(int i = 1; i < 5; i++)if(a[i] != a[i - 1]) return 0;for(int i = 4; i >= 0; i--)p.g.push_back(v[p.s[i][0]]);return 1;
}
bool FullHouse(node &p)
{int num[15];memset(num, 0, sizeof(num));int a[5];for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]];for(int i = 0; i < 5; i++) num[a[i]]++;int fg1 = 0, fg2 = 0;for(int i = 2; i <= 14; i++)if(num[i] == 3) fg1 = 1;else if(num[i] == 2) fg2 = 1;if(fg1 && fg2){for(int i = 2; i <= 14; i++)if(num[i] == 3) p.g.push_back(i);for(int i = 2; i <= 14; i++)if(num[i] == 2) p.g.push_back(i);return 1;}return 0;
}
bool FourofaKind(node &p)
{int num[15];memset(num, 0, sizeof(num));int a[5];int flag = 0;for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]];for(int i = 0; i < 5; i++) num[a[i]]++;for(int i = 2; i <= 14; i++)if(num[i] == 4){flag = 1;p.g.push_back(i);}if(flag){for(int i = 2; i <= 14; i++)if(num[i] == 1) p.g.push_back(i);return 1;}return 0;
}
bool StraightFlush(node &p)
{int a[5], b[5];for(int i = 0; i < 5; i++) a[i] = v[p.s[i][0]], b[i] = v[p.s[i][1]];for(int i = 1; i < 5; i++)if(a[i] != a[i - 1] + 1) return 0;for(int i = 1; i < 5; i++)if(b[i] != b[i - 1]) return 0;p.g.push_back(a[4]);return 1;
}
bool RoyalFlush(node &p)
{if(p.s[0][0] == 'T' && p.s[1][0] == 'J' && p.s[2][0] == 'Q' && p.s[3][0] == 'K' && p.s[4][0] == 'A' && p.s[0][1] == p.s[1][1] && p.s[1][1] == p.s[2][1] && p.s[2][1] == p.s[3][1] && p.s[3][1] == p.s[4][1]){p.g.push_back(14);return 1;}return 0;
}
void fuck(node &p)
{if(RoyalFlush(p)) p.rk = 10;else if(StraightFlush(p)) p.rk = 9;else if(FourofaKind(p)) p.rk = 8;else if(FullHouse(p)) p.rk = 7;else if(Flush(p)) p.rk = 6;else if(Straight(p)) p.rk = 5;else if(ThreeofaKind(p)) p.rk = 4;else if(TwoPairs(p)) p.rk = 3;else if(OnePair(p)) p.rk = 2;else if(HighCard(p)) p.rk = 1;
}
bool gao()
{fuck(p1);fuck(p2);if(p1.rk > p2.rk) return 1;else if(p1.rk == p2.rk){int size = p1.g.size();for(int i = 0; i < size; i++)if(p1.g[i] > p2.g[i]) return 1;else if(p1.g[i] < p2.g[i]) return 0;return 0;}else return 0;
}
int main()
{freopen("C:/poker.txt", "r", stdin);int now = 0;int ans = 0;for(int i = 2; i < 10; i++) v['0' + i] = i;v['T'] = 10;v['J'] = 11;v['Q'] = 12;v['K'] = 13;v['A'] = 14;v['C'] = 1;v['D'] = 2;v['S'] = 3;v['H'] = 4;while(1){for(int i = 0; i < 5; i++) cin >> p1.s[i];for(int i = 0; i < 5; i++) cin >> p2.s[i];for(int i = 0; i < 5; i++) p1.g.clear(), p2.g.clear();sort(p1.s, p1.s + 5, cmp);sort(p2.s, p2.s + 5, cmp);if(gao()) ans++;now++;if(now == 1000) break;}cout << ans << endl;return 0;
}


  相关解决方案