比赛的时候没有想清楚,直接排序然后从前向后dfs,一直卡着,就是没有想到其他的情况。其实有可能是223344这样的,最后写的时候忘记处理了222233334444情况,还是看别人博客才发现的。还是太菜了,继续努力。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
#define ll long long

using namespace std;

char mian[10]="mspz";
map<string,int> majong[4];
map<string,int>::iterator itr;
string tmp;
int cnt[4][14];

int dfs(int x,int c1,int c2)
{
    int i,j,flag=0;
    if(c1==4 && c2==1)
        return 1;
    else if(c1>4 || c2>1 || x>=14)
        return 0;
    if(c2==0)
    {
        for(i=0;i<4;i++)
            for(j=1;j<=9;j++)
                if(cnt[i][j]>=2)
                {
                    cnt[i][j]-=2;
                    flag|=dfs(x+2,c1,c2+1);
                    cnt[i][j]+=2;
                    if(flag)
                        return 1;
                }
        return 0;
    }
    else
    {
        for(i=0;i<4;i++)
            for(j=1;j<=9;j++)
            {
                if(cnt[i][j]==0)
                    continue;
                else if(cnt[i][j]==1)
                {
                    if(i!=3 && cnt[i][j+1]>0 && cnt[i][j+2]>0)
                    {
                        cnt[i][j]--,cnt[i][j+1]--,cnt[i][j+2]--;
                        flag|=dfs(x+3,c1+1,c2);
                        cnt[i][j]++,cnt[i][j+1]++,cnt[i][j+2]++;
                        if(flag)
                            return 1;
                    }
                    else
                        return 0;
                }
                else if(cnt[i][j]==2)
                {
                    if(i!=3 && cnt[i][j+1]>=2 && cnt[i][j+2]>=2)
                    {
                        cnt[i][j]-=2,cnt[i][j+1]-=2,cnt[i][j+2]-=2;
                        flag|=dfs(x+6,c1+2,c2);
                        cnt[i][j]+=2,cnt[i][j+1]+=2,cnt[i][j+2]+=2;
                        if(flag)
                            return 1;
                    }
                    else
                        return 0;
                }
                else if(cnt[i][j]==3)
                {
                    cnt[i][j]-=3;
                    flag|=dfs(x+3,c1+1,c2);
                    cnt[i][j]+=3;
                    if(flag)
                        return 1;
                    if(i!=3 && cnt[i][j+1]==3 && cnt[i][j+2]==3)
                    {
                        cnt[i][j]-=3,cnt[i][j+1]-=3,cnt[i][j+2]-=3;
                        flag|=dfs(x+9,c1+3,c2);
                        cnt[i][j]+=3,cnt[i][j+1]+=3,cnt[i][j+2]+=3;
                        if(flag)
                            return 1;
                    }
                    else
                        return 0;
                }
                else if(cnt[i][j]==4)
                {
                    cnt[i][j]-=3;
                    flag|=dfs(x+3,c1+1,c2);
                    cnt[i][j]+=3;
                    if(flag)
                        return 1;
                    if(i!=3 && cnt[i][j+1]==4 && cnt[i][j+2]==4)
                    {
                        cnt[i][j]-=4,cnt[i][j+1]-=4,cnt[i][j+2]-=4;
                        flag|=dfs(x+12,c1+3,c2);
                        cnt[i][j]+=4,cnt[i][j+1]+=4,cnt[i][j+2]+=4;
                        if(flag)
                            return 1;
                    }
                    else
                        return 0;
                }
            }
    }
}

inline void add(string t)
{
    switch(t[1])
    {
    case 'm':
        cnt[0][t[0]-'0']++; break;
    case 's':
        cnt[1][t[0]-'0']++; break;
    case 'p':
        cnt[2][t[0]-'0']++; break;
    case 'z':
        cnt[3][t[0]-'0']++; break;
    };
}

inline int check()
{
    int i,j;
    for(i=0;i<4;i++)
        for(j=1;j<=9;j++)
            if(cnt[i][j]>4)
                return 0;
    return 1;
}

int main()
{
    int i,j;
    string str;
    while(cin>>str)
    {
        memset(cnt,0,sizeof(cnt));
        add(str);
        for(i=0;i<12;i++)
            cin>>str, add(str);
        /*for(i=0;i<4;i++)
        {
            for(j=1;j<=9;j++)
                cout<<cnt[i][j]<<' ';
            cout<<endl;
        }*/

for(i=0;i<3;i++)
            for(j=1;j<=9;j++)
            {
                tmp="";
                tmp+='0'+j;
                tmp+=mian[i];
                cnt[i][j]++;
                if(check() && dfs(0,0,0))
                    cout<<tmp<<endl;
                cnt[i][j]--;
            }
        for(j=1;j<=7;j++)
        {
            tmp="";
            tmp+='0'+j;
            tmp+=mian[3];
            cnt[3][j]++;
            if(check() && dfs(0,0,0))
                cout<<tmp<<endl;
            cnt[3][j]--;
        }
    }
    return 0;
}

/*

1s 2s 3s 4s 5s 6s 7s 8s 9s 1z 1z 3p 4p

*/

转载于:https://www.cnblogs.com/canchan/p/11072521.html

2019计蒜之道 B:个性化评测系统相关推荐

  1. 2019 计蒜之道 复赛 D——“星云系统”(单调栈||队列+贪心)

    19.97% 1000ms 131072K VIPKID 是在线少儿英语教育平台,网络稳定是在线教育课程质量的红线,VIPKID 为此推出了全球最稳定的教育网络系统 -- "星云系统&quo ...

  2. 2019 计蒜之道 复赛 “星云系统” 贪心

    题目链接:https://nanti.jisuanke.com/t/39614 题解:首先把每个字符的位置保存下来,然后很容易就想到二分去做,但是T了,所以我们就可以O(n)去做,记录下位置后,直接枚 ...

  3. 2019 计蒜之道 复赛 撑起信息安全“保护伞” 贪心

    题目链接:https://nanti.jisuanke.com/t/39615 题解:两种都从后往前,l记录左括号的数量,r记录右括号数量,找前驱时,要满足第一个符合的s[i]==')' && ...

  4. 2019计蒜之道复赛A:外教Michale变身大熊猫【树状数组+dp】

    题目: 题目在这里~~~ 分析: 按照题意,只需要找到最长上升子序列的数量和每个数对最长上升子序列的贡献次数即可,可以二分找到经过每个数的最长上升子序列的长度,但这样不好统计数量:考虑dp,定义dp[ ...

  5. 2019计蒜之道复赛-A-外教 Michale 变身大熊猫(线段树求LIS及其元素出现概率)

    时限:1000ms            空间限制:524288K 题目链接https://nanti.jisuanke.com/t/39611 外教变身萌翻小学员,VIPKID "AR 变 ...

  6. 2019 计蒜之道 复赛 A. 外教 Michale 变身大熊猫

    题目链接 题意:本题就是很显然的题意,让你求出共有多少个最长上升子序列,每个数在多少个最长上升子序列中. 这题的难点在于如何求出每个数在多少最长上升子序列中,显然可以用dp,直接dp时间复杂度不允许, ...

  7. 2019年第五届计蒜之道复赛总结

    又是一年计蒜客,沙雕ACMer欢乐多 热心市民yzm10按捺不住冲动,在期末期间又打了一场比赛. 赛点:204(与罚时惊人的相似) 做完两题排在一百多名,以为稳了(其实后面做不动了)比到一半就开始挂机 ...

  8. 计蒜之道2015程序设计大赛初赛第三场——腾讯手机地图

    计蒜之道2015程序设计大赛初赛第三场--腾讯手机地图 (一)题面 腾讯手机地图的定位功能用到了用户手机的多种信号,这其中有的信号的作用范围近,有的信号作用的范围则远一些.有的信号相对于用户在不同的方 ...

  9. 2017 计蒜之道 初赛 第一场 A题B题

    阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.我们可以用坐标系来描述棋盘: ...

最新文章

  1. Ubuntu下安装和配置Apache2
  2. jenkins配置git
  3. 参考别人博客,自己实现用idea运行eclipse项目--学生管理系统-
  4. python3.6.4安装教程-python3.6.4如何安装到树莓派3代
  5. Tomcat 服务自动启动
  6. docker-compose搭建kafka集群
  7. Ubuntu 下安装tomcat和配置eclipse的遇到的问题的一点心得。
  8. Haclon 一些关于显示的基本算子(1)
  9. TensorFlow 中的 tf.train.exponential_decay() 指数衰减法
  10. 组合使用Memento模式与Command模式实现多级Redo和Undo
  11. cecore.cls.php 08cms,08CMS产品库报价系统 v1.1 utf8版PHP CMS源码下载-华软网
  12. 程序员面试HR常问问题(含答案)
  13. 破解 Linux 管理员密码
  14. 《我的野蛮女友》主题,乔治·温斯顿《卡农变奏曲》,帕卡贝尔的《D大调卡农》...
  15. C语言程序计算自己活了多少天
  16. 浅析:宝贝标题关键词优化技巧
  17. 数字图像处理例题整理
  18. FFmpeg sws_scale库文件分析
  19. |密码狗|Dongle|克隆狗|U盘狗
  20. 在DirectX9.0中使用Mesh

热门文章

  1. 005-SDK框架之LYWSDKCallBackListener.h
  2. 计算机程序无权限卸载,无法卸载win7电脑中的软件,提示权限不足怎么办?
  3. php 获取所有下周1,用php获取本周,下周,本月,下月,本季度日期(摘)
  4. Nginx动态、静态分离,Nginx配置中做适配
  5. 怎么用numpy读取excel的数据画三维图_python初学者,如何快速匹配excel任务
  6. MYSQL储存过程和储存函数和变量
  7. rhel 8.2不识别unicode_Unicode的文本处理二三事
  8. MySQL退出选择表格_MySQL常用命令
  9. matlab 数字识别_在MATLAB中利用神经网络进行分类
  10. boot jpa mysql postman spring_听说过spring-data-jdbc么?来个最佳实践