题解 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 ...
随机推荐
- 模型的细致程度--Level of Development
模型的细致程度,英文称作Level of Details,也叫作Level of Development.描述了一个BIM模型构件单元从最低级的近似概念化的程度发展到最高级的演示级精度的步骤.美国建筑 ...
- win7 64bit安装redis
win7 64bit安装redis 1 先安装redis客户端 1.下载Redis的压缩包 https://github.com/dmajkic/redis/downloads 我下载的是redis- ...
- MongoDB自学------(3)MongoDB文档操作
一.插入文档 二.查询文档 三.更新文档 可以看到标题(title)由原来的 "Mongodb" 更新为了 "MongoDBtest". 以上语句只会修改第一条 ...
- vue开发 element的select下拉框设定初值后,不能重新选择的问题
问题描述: 用的element的select可多选的下拉选框,在回显后有初始值的情况下,不能修改,也不能再选择 如图,明明点击了一般内勤主管,但没有任何反应 <el-select v-model ...
- ElasticSearch 6.7.1操作纪录
以下操作均在 6.7.1版本中正常 c# ES客户端 测试项目地址:https://gitee.com/dhclly/IceDog.ElasticSearchClient/tree/master/sr ...
- Devexpress treelist两张表父子节点设置、筛选、分页、排序、页面跳转demo
效果图 网上查了很多例子自己结合和修改了一下.最下方的分页跳转是dev的datapager控件.控件的属性事件自己研究一下. 代码如下 public partial class MMDefinitio ...
- 深入浅出JVM的锁优化案例
锁优化 适应性自旋(Adaptive Spinning) 线程阻塞的时候,让等待的线程不放弃cpu执行时间,而是执行一个自旋(一般是空循环),这叫做自旋锁. 自旋等待本身虽然避免了线程切换的开销,但它 ...
- GitBash上传项目出现[fatal: remote origin already exists.]问题解决方案
问题截图如下: 当出现这个问题时,不要慌,只需要输入 git remote rm origin 就可以解决,输入完前面的命令后再次 输入 git remote add origin https://. ...
- MQ 分布式事务 -- 微服务应用
1.背景 友情链接:https://www.cnblogs.com/Agui520/p/11187972.html https://blog.csdn.net/fd2025/article/detai ...
- mysql用查询结果当删除的判断条件进行删除报错1093 You can't specify target table解决方法
mysql用查询结果当删除的判断条件进行删除报错1093 You can't specify target table解决方法 #分开两个sql执行正常的语句,只保留最新1000条数据,删掉1000条 ...