Project Euler problem 54


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

首先就是判断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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值