题解 P2668 【斗地主】
dfs+简易剪枝+简易a*
思路:
dfs+简易剪枝+简易a(我也不知道算不算a);
dfs参数记录层数
按消耗牌多少的贪心顺序搜索
有几种情况可以不用搜索(但我还是搜索了)
可以用a*估算出来
最后剩下有单牌,对子,三张牌,4炸弹的时候可以直接算出来;
还有一个剪枝,一个简简单单的剪枝(if(x>=ans) return;);
这个因为省略了很多情况所以并不很慢;
反正我是过了;
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,jk,kl,ai,bi,hand[],ans=0x7fffffff;
int t,c[];
int A_star() {
memset(c,,sizeof(c));
int tot=,kll=;
for(int i=; i<=; i++) c[hand[i]]++; //统计当前还剩的牌数
while(c[]&&c[]>) c[]--,c[]-=,tot++;//四带一对
while(c[]&&c[]>) c[]--,c[]-=,tot++;//四带两单
while(c[]&&c[]) c[]--,c[]--,tot++;//三带二
while(c[]&&c[]) c[]--,c[]--,tot++;//三带一
for(int i=; i<=; i++) kll+=c[i];
return tot+kll;//带牌+三张 对子 单张
}
void dfs(int x) {
// num=min(num,ans);
// printf("%d %d ",x,ans);
// for(int i=1;i<=15;i++) printf("%d ",hand[i]);
// printf("\n");
if(x>=ans) return;
int pd=;
int cur=; for(int i=; i<=; i++) { //四带两对
if(hand[i]>=) {
hand[i]-=;
for(int j=; j<=; j++) {
if(j!=i&&hand[j]>=) {
hand[j]-=;
for(int v=; v<=; v++) {
if(hand[v]>=&&v!=j) {
hand[v]-=;
// printf("1 ");
dfs(x+);
hand[v]+=;
}
}
hand[j]+=;
}
}
hand[i]+=;
}
}
for(int i=; i<=; i++) { //四带二单
if(hand[i]>=) {
hand[i]-=;
for(int j=; j<=; j++) {
if(j!=i&&hand[j]>=) {
hand[j]-=;
for(int v=; v<=; v++) {
if(hand[v]>=&&v!=i) {
hand[v]-=;
/// printf("2 ");
dfs(x+);
hand[v]+=;
}
}
hand[j]+=;
}
}
hand[i]+=;
}
}
for(int i=; i<=; i++) { //三顺
cur=;
if(hand[i]>=&&i<=) {
for(int j=i; j<=; j++) {
if(hand[j]>=) cur++;
else break;
}
for(int j=cur; j>=; j--) {
for(int v=i; v<=j+i-; v++) hand[v]-=;
// printf("3 ");
dfs(x+);
for(int v=i; v<=j+i-; v++) hand[v]+=;
}
}
}
for(int i=; i<=; i++) { //二顺
cur=;
if(hand[i]>=&&i<=) {
for(int j=i; j<=; j++) {
if(hand[j]>=) cur++;
else break;
}
for(int j=cur; j>=; j--) {
for(int v=i; v<=j+i-; v++) hand[v]-=;
// printf("4 ");
dfs(x+);
for(int v=i; v<=j+i-; v++) hand[v]+=;
}
}
}
for(int i=; i<=; i++) { //一顺
cur=;
if(hand[i]>=&&i<=) {
for(int j=i; j<=; j++) {
if(hand[j]>=) cur++;
else break;
}
for(int j=cur; j>=; j--) {
for(int v=i; v<=j+i-; v++) hand[v]-=;
// printf("5 ");
dfs(x+);
for(int v=i; v<=j+i-; v++) hand[v]+=;
}
}
}
for(int i=; i<=; i++) { //三带二
if(hand[i]>=) {
hand[i]-=;
for(int j=; j<=; j++) {
if(j!=i&&hand[j]>=) {
hand[j]-=;
// printf("6 ");
dfs(x+);
hand[j]+=;
}
}
hand[i]+=;
}
}
for(int i=; i<=; i++) { //三带一
if(hand[i]>=) {
hand[i]-=;
for(int j=; j<=; j++) {
if(j!=i&&hand[j]>=) {
hand[j]-=;
// printf("7 ");
dfs(x+);
hand[j]+=;
}
}
hand[i]+=;
}
}
if(hand[]>=&&hand[]>=) {
hand[]--;
hand[]--;
// printf("8 ");
dfs(x+);
hand[]++;
hand[]++;
}
jk=A_star();
if(x+jk>=ans) return;
else ans=x+jk;
} int main() {
scanf("%d%d",&t,&n);
while(t--) {
memset(hand,,sizeof(hand));
ans=0x7fffffff;
for(int i=; i<=n; i++) {
cin>>ai>>bi;
if(ai!=) {
if(ai>=) hand[ai-]++;
else hand[+ai]++;
} else {
if(bi==) hand[]++;
else hand[]++;
}
}
// for(int i=1;i<=15;i++) printf("%d ",hand[i]);
// printf("\n");
dfs();
printf("%d\n",ans);
}
return ;
}
斗地主,感觉写完这个代码我都成了斗地主大神了。
题解 P2668 【斗地主】的更多相关文章
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- Luogu P2668 斗地主(NOIP2015)
还记得那道我只用特判得了30分的"斗地主"吗? 我今天脑抽打算把它改A掉.为什么不用这大好时光去干些更有意义的事 于是我就挖了这个坑. 题解: 题目链接:P2668 斗地主 本题就 ...
- 洛谷P2668 斗地主 [NOIP2015]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- [NOIP2015] 提高组 洛谷P2668 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- P2668 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...
- P2668 斗地主 dp+深搜版
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- P2668 斗地主 贪心+深搜
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668斗地主(搜索)noip2015
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷—— P2668 斗地主
https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...
随机推荐
- maven打包时生成源代码
<build> <finalName>${artifactId}</finalName> <plugins> <plugin> <ar ...
- picture元素的使用
前言 相信前端小伙伴们对img元素已经烂熟于心,但不知是否了解picture元素呢? 简单来说,picture元素通过包含一个或多个<source>元素和一个<img>元素再结 ...
- Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程
这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...
- 用guava快速打造两级缓存能力
首先,咱们都有一共识,即可以使用缓存来提升系统的访问速度! 现如今,分布式缓存这么强大,所以,大部分时候,我们可能都不会去关注本地缓存了! 而在一起高并发的场景,如果我们一味使用nosql式的缓存,如 ...
- ExcelHelper based on NPOI
//Export data to excel via NPOI public static void ExportDataTableToExcel(DataTable dataTable, strin ...
- 【设计模式】Composite
目录 前言 安卓View的实现 View Beyond setContentView setContentView做了什么事情? 如何将xml文件变成对象的? 小结 View的绘制流程 三个流程 三个 ...
- WebService 创建、发布、调用
环境Win7+VS2017 启用IIS 查看iis是否启用 新建 ASP.NET Web 应用程序 项目,项目中添加Web 服务 在 asmx 文件中添加需要的方法 运行结果 发布 创建新的文件夹, ...
- 腾讯WeTest亮相—腾讯全球数字生态大会现场
2019年5月21-23日腾讯全球数字生态大会在云南昆明滇池国际会展中心顺利召开. 此次大会上万人到场参与,大会由主峰会.分论坛.数字生态专题展会以及腾讯数字生态人物颁奖盛典四大板块构成.作为腾讯战略 ...
- js中this由来
这篇文章主要是讲述js中的this是什么?是怎么来的? 我们首先创建一个person对象,如下: var person = { name: 'wyh', age: 22, sayHi: functio ...
- maven 学习---使用Maven运行单元测试
要通过Maven运行单元测试,发出此命令: mvn test 这会在你的项目中运行整个单元测试. 案例学习 创建两个单元测试,并通过 Maven 的运行它.参见一个简单的 Java 测试类: pack ...