前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >悬赏题No.1- 扑克牌 解题源码!

悬赏题No.1- 扑克牌 解题源码!

作者头像
ACM算法日常
发布2018-08-07 18:22:06
3110
发布2018-08-07 18:22:06
举报
文章被收录于专栏:ACM算法日常ACM算法日常

第一期悬赏题很早之前就被破解了

,Sorry一直没时间贴代码。该类题目的源码不做讲解,只贴源码,有兴趣的可以看看。

另外非常感谢工学三号馆713实验室的童鞋们,没有让这道题成为悬疑题!!

暂时没想到第二道悬赏题

,Fighting and waiting~~

linux下编译:

1、将如下源代码保存为poker.cpp

2、创建一个data.txt,写入测试数据:

4 4 6 7 7 7 8 8 9 10 10 10 J J J Q A A 2 2 JB

3、执行g++ -std=c++11 poker.cpp

4、直接运行./a.out

源代码:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS

#include<fstream>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<vector>
using namespace std;

fstream file("data.txt");
#define cin file


vector <int >num[20], name[20];
int nu, msum;
int flag[200];

int ff()
{
    int i = 3;
    while (i < 20)
    {
        if (flag[i] > 0)
            return i;
        i++;
    }
    return 20;
}

bool jud1(int i, int n)
{
    i = i + n;
    while (n < i)
    {
        if (flag[n] < 1)
        {
            return false;
            break;
        } n++;
    }
    return true;
}
bool jud2(int i, int n)
{
    i = i + n;
    while (n < i)
    {
        if (flag[n] < 2)
        {
            return false;
            break;
        }
        n++;
    }
    return true;
}
bool jud3(int i, int n)
{
    if (num[13].size() < i)return false;
    i = i + n;
    while (n < i)
    {
        if (flag[n] < 3)
        {
            return false;
            break;
        }
        n++;
    }
    return true;
}
void dfs(int sum, int h)
{
    int i = ff();
    if (flag[i] == 4)
    {
        num[h].push_back(i);//炸弹
        num[h].push_back(i);
        num[h].push_back(i);
        num[h].push_back(i);
        flag[i] -= 4;
        dfs(sum + 35, h + 1);
        num[h].clear();
        flag[i] += 4;
    }
    num[h].clear();
    if (i == 20)
    {
        if (sum > msum)
        {
            msum = sum;
            for (i = 0; i < 12; i++)
                name[i] = num[i];
            name[13] = num[13];
        }
        return;
    }
    int j = 0, k, l;
    for (j = 5; j < 12; j++)
    {
        if (!jud1(j, i))
            break;
        l = j + i;
        for (k = i; k < l; k++)
        {
            num[h].push_back(k);//顺子
            flag[k]--;
        }
        dfs(sum + j * 5, h + 1);
        num[h].clear();
        for (k = i; k < l; k++)
        {
            flag[k]++;
        }
    }
    for (j = 3; j < 12; j++)
    {
        if (!jud2(j, i))
            break;
        l = j + i;
        for (k = i; k < l; k++)
        {
            num[h].push_back(k);//连对
            num[h].push_back(k);
            flag[k] -= 2;
        }
        dfs(sum + j * 10 - 5, h + 1);
        num[h].clear();
        for (k = i; k < l; k++)
        {
            flag[k] += 2;
        }
    }
    if (flag[i] > 1)
    {
        num[h].push_back(i);//对子
        num[h].push_back(i);
        flag[i] -= 2;
        dfs(sum + 10, h + 1);
        num[h].clear();
        flag[i] += 2;
    }

    num[13].push_back(i);//单牌
    flag[i]--;
    dfs(sum + 1, h);
    num[13].pop_back();
    flag[i]++;
    if (flag[i] > 2 && num[13].size() > 0)
    {
        j = *(num[13].end() - 1);//三带
        num[h].push_back(i);
        num[h].push_back(i);
        num[h].push_back(i);
        num[h].push_back(j);
        num[13].pop_back();
        flag[i] -= 3;
        dfs(sum + 14, h + 1);
        num[h].clear();
        flag[i] += 3;
        num[13].push_back(j);
    }
    for (j = 2; j < 12; j++)
    {
        if (!jud3(j, i))
            break;
        l = j + i;
        for (k = i; k < l; k++)
        {
            num[h].push_back(k);//飞机
            num[h].push_back(k);
            num[h].push_back(k);
            num[h].push_back(*(num[13].end() - 1));
            num[13].pop_back();
            flag[k] -= 3;
        }
        dfs(sum + 15 * j - j, h + 1);
        for (k = i; k < l; k++)
        {
            num[13].push_back(*(num[h].end() - 3 * (l - k) + 2));
            flag[k] += 3;
        }
        num[h].clear();
    }

}

void pr(int i)
{
    if (i == 16)cout << 2;
    else if (i < 11)
        cout << i;
    else if (i == 11)
        cout << 'J';
    else if (i == 12)
        cout << 'Q';
    else if (i == 13)
        cout << 'K';
    else if (i == 14)
        cout << 'A';
    else if (i == 20)
        cout << "LB";
    else cout << "LR";
}

bool cmp(vector<int>a, vector<int>b)
{
    int i = a.size(), j = b.size();
    if (i != j)
        return i > j;
    if (i < 1)return false;
    if (j < 1)return true;
    if (i == 4)
    {
        if (a[i - 1] == a[i - 2] && b[j - 1] != b[j - 2])
            return true;
        if (a[i - 1] != a[i - 2] && b[j - 1] == b[j - 2])
            return false;
        else return a[0] < b[0];
    }
    if (a[0] > 15)
        return true;
    if (b[0] > 15)
        return false;
    return a[0] < b[0];
}


int main()
{
    //freopen("a.txt", "r", stdin);
    int n = 20;
    int i = 0, j, k;
    string a;
    while (n--)
    {
        cin >> a;
        if (a[0] >= '0' && a[0] <= '9')
        {
            if (stoi(a) != 2)
                flag[stoi(a)]++;
            else flag[16]++;
            stoi(a);
        }
        else
        {
            if (a[0] == 'J' && a.size() < 2)
                flag[11]++;
            else if (a[0] == 'Q')
                flag[12]++;
            else if (a[0] == 'K')
                flag[13]++;
            else if (a[0] == 'A')
                flag[14]++;
            else if (a[1] == 'B')
                flag[20]++;
            else  flag[21]++;
        }
    }
    if (flag[20] && flag[21])
    {
        msum += 35;
        name[12].push_back(20);
        name[12].push_back(21);
    }
    else if (flag[20])
    {
        msum++;
        name[13].push_back(20);
    }
    else if (flag[21])
    {
        msum++;
        name[13].push_back(21);
    }
    dfs(msum, 0);
    n = 13;

    sort(name, name + 13, cmp);
    sort(name[13].begin(), name[13].end());
    i = 0;
    while (!name[i].empty())
        i++;
    i += name[13].size();
    cout << i << ' ' << msum << endl;
    i = 0;
    while (i < n)
    {
        k = name[i].size();
        if (k == 0)break;
        pr(name[i][0]);
        for (j = 1; j < k; j++)
        {
            cout << ' '; pr(name[i][j]);
        }
        cout << endl;
        i++;
    }
    k = name[13].size();
    if (k > 0)
    {
        pr(name[13][0]);
        cout << endl;
        for (j = 1; j < k; j++)
        {
            pr(name[13][j]);
            cout << endl;
        }
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档