题面

自己网上去搜吧…

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 10000000
#define maxn 40
using namespace std;int t,n,temp,a,zhang[maxn],ans=INF;void dfs(int,int,int,int);
void shunzi(int,int,int,int,int);void chu(int x,int dep,int left){//在第dep手牌的时候出x号牌,还剩left张牌 if(x>14) return;if(dep>ans) return;//如果比当前最优解差就跳出 if(left==0){ ans=min(ans,dep); return; }//如果剩下的手牌为0,记录答案 if(zhang[x]==0) chu(x+1,dep,left);//如果x号牌出完了就该出x+1号牌 else for(int i=zhang[x];i>0;i--) dfs(x,i,dep,left);//搜索第x号牌出1~出完的情况 return;
}void dfs(int p,int shu,int dep,int left){//第p张牌出shu张,出了dep手牌,剩下left张牌 if(shu==4){zhang[p]-=4;chu(p,dep+1,left-4);//出炸弹//出四带二(四带一对,四带两对,四带两张) for(int i=p+1;i<=14;i++){if(zhang[i]>=1){zhang[i]--;for(int j=p+1;j<=14;j++){if(zhang[j]>=1){zhang[j]--;chu(p,dep+1,left-6);zhang[j]++;}}zhang[i]++;}}//四带两张或一对 for(int i=p+1;i<=14;i++){for(int j=i+1;j<=14;j++){if(zhang[i]>=2&&zhang[j]>=2){zhang[i]-=2; zhang[j]-=2;chu(p,dep+1,left-8);zhang[i]+=2; zhang[j]+=2;}}}//四带两对zhang[p]+=4;return;}else if(shu==3){zhang[p]-=3;//出三顺子if(p>2){for(int i=p+1;i<=14;i++){if(zhang[i]<3) break;else shunzi(p,i,3,dep,left);}}//出三带二for(int i=p+1;i<=14;i++){if(zhang[i]>=2){zhang[i]-=2;chu(p,dep+1,left-5);zhang[i]+=2;}} //出三带一for(int i=p+1;i<=14;i++){if(zhang[i]>=1){zhang[i]-=1;chu(p,dep+1,left-4);zhang[i]+=1;}}chu(p,dep+1,left-3);zhang[p]+=3; return;}else if(shu==2){zhang[p]-=2;//出双顺子if(p>2&&zhang[p+1]>=2&&zhang[p+2]>=2) for(int i=p+2;i<=14;i++){if(zhang[i]<2){break;}else shunzi(p,i,2,dep,left);}//出四带两对for(int i=p+1;i<=14;i++){if(zhang[i]>=4){zhang[i]-=4;chu(p,dep+1,left-6); //四带一对 for(int j=p+1;j<=14;j++){if(zhang[j]>=2){zhang[j]-=2;chu(p,p+1,left-8);zhang[j]+=2;}}zhang[i]+=4;}}//出三带二for(int i=p+1;i<=14;i++){if(zhang[i]>=3){zhang[i]-=3;chu(p,dep+1,left-5);zhang[i]+=3;}}//出单对chu(p,dep+1,left-2);zhang[p]+=2; return;}else if(shu==1){zhang[p]-=1;//出顺子if(p>2&&p<11&&zhang[p+1]>=1&&zhang[p+2]>=1&&zhang[p+3]>=1&&zhang[p+4]>=1){//因为大小王不能进顺子所以p<11 for(int i=p+4;i<=14;i++){if(zhang[i]<1){break;}else shunzi(p,i,1,dep,left);}}//出四带两张单牌for(int i=p+1;i<=14;i++){if(zhang[i]>=4){zhang[i]-=4;for(int j=p+1;j<=14;j++){if(zhang[j]>=1){zhang[j]-=1;chu(p,dep+1,left-6);zhang[j]+=1;}}zhang[i]+=4;}}//出三带一for(int i=p+1;i<=14;i++){if(zhang[i]>=3){zhang[i]-=3;chu(p,dep+1,left-4);zhang[i]+=3;}} //出单张chu(p,dep+1,left-1);zhang[p]+=1;return;}return;
}void shunzi(int x,int y,int type,int dep,int left){//从第x到y张牌开始出顺子,出type种顺子 for(int i=x+1;i<=y;i++) zhang[i]-=type;chu(x,dep+1,left-type*(y-x+1));for(int i=x+1;i<=y;i++) zhang[i]+=type;return;
}int main(){freopen("landlords.in","r",stdin);freopen("landlords.out","w",stdout);scanf("%d%d",&t,&n);while(t--){memset(zhang,0,sizeof(zhang));ans=INF;for(int i=1;i<=n;i++) {scanf("%d%d",&a,&temp);if(a==1) zhang[14]++;else zhang[a]++;}chu(0,0,n);printf("%d\n",ans);}return 0;
}//hcy太强辣~\(≧▽≦)/~啦啦啦 

转载于:https://www.cnblogs.com/leotan0321/p/6081376.html

【NOIp 2015】【DFS】斗地主相关推荐

  1. 【NOIP 2015】斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  2. NOIP 2015 Day1T3 斗地主

    暴力不解释,数据随机生成,我们可以贪心的按打出牌的数量从多到少出,那么这样就能够使最优化剪枝起到很重要的作用,怎样简化代码呢?我从题解中发现了一种将单顺子,双顺子和三顺子合成一种的方法,具体实现看代码 ...

  3. NOIP 2015 蒟蒻做题记录

    昨天做了noip 2015 的题.因为之前做过几道,最开始做的很快,也都A了.可是子串斗地主运输计划什么的这些没做过的题还是把我恶心的不行QAQ我这个大蒟蒻还是没有A掉..所以说先写一下应该得到的暴力 ...

  4. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  5. NOIP 2015 D1 T2 信息传递

    趁着我还活在网上 多写点题解 * NOIP 2015 D1 T2 信息传递* 2996: [NOIP2015]信息传递 D1 T2 Time Limit: 1 Sec Memory Limit: 12 ...

  6. NOIP 2015 提高组 初赛

    NOIP 2015 提高组 初赛 疑难点 学习 感悟. 一. 3. 示例如下(来自自个的理解): 101.101 十进制 转十进制1*10^2+0*10^1+1*10^0+1*10^-1+0*10^- ...

  7. NOIP 2015 普及组 初赛

    NOIP 2015 普及组 初赛 疑难点 学习 感悟. 本份试卷本人得分93,两处错误,一错在二.1.题,眼花了,多数了个数据3241:二错在四.2.题(5)空,该空写成rbound=mid-1,这个 ...

  8. NOIP 2015 简记

    Day 0 12点上车,坐在准备出发的车子上和一群同学打招呼,真是逗.. 由于1个同学忘带身份证,强行拖到1点钟才发车,RP这么差肯定要跪. 路上一群同学在玩关灯游戏,一想是POJ 1222,就顺手写 ...

  9. NOIP 2015 提高组 Day2

    期望得分:100+10+60=170 实际得分:100+10+35=145 http://www.cogs.pro/cogs/page/page.php?aid=16 T1 跳石头 时间限制:1 s  ...

最新文章

  1. ubuntu ibus谷歌输入法安装
  2. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll
  3. 开课吧python学费-分享一个小白也能月赚2万的新技能
  4. pythonguitkinter组件_四十八、Python中的GUI布局tkinter
  5. 数据结构(七)排序---直接插入排序(稳定)
  6. python docx 字体大小_Python操作Word的入门教程
  7. android学习的java,android学习之java常识
  8. JS学习笔记 等于和包装对象
  9. php 的点代表什么意思,linux .(点)是什么意思
  10. MVC 使用 Webuploader 插件 传递额外参数 备忘笔记
  11. 理解MapReduce计算构架
  12. InfluxDB读写性能测试
  13. android 热更新jar,Android热更新之so库的热更新
  14. java oracle中文乱码_解决java oracle中文乱码的方法
  15. Yii2汉字转拼音类
  16. drupal插入css,drupal8 自定义主题开发——导入自定义css和js
  17. eot文件html,html – 为什么IE8没有加载我的eot文件?
  18. mui实现二维码扫描功能
  19. 编译make px4_fmu-v2_default upload时,报错ERROR Board can accept larger flash images (2080768 bytes)
  20. IP座席接入系统方案

热门文章

  1. 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历
  2. Cannot access repo1 (http://repo1.maven.org/maven2) in offline mode and the
  3. 数据库:MySQL高频面试题,大厂必备!
  4. MYSQL处理数据重复值
  5. 浅说 XSS和CSRF
  6. 防止SQL注入式攻击的笔记
  7. 重新设计Videoland的登录页面— UX案例研究
  8. figma设计_设计原型的最简单方法:Figma速成课程
  9. 识别人声_演唱人声的5个技巧
  10. shell编程系列20--文本处理三剑客之awk常用选项