题解 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 ...
随机推荐
- 【转】pywinauto教程
一.环境安装 1.命令行安装方法 pip install pywinauto==0.6.7 2.手动安装方法 安装包下载链接:pyWin32: python调用windows api的库https:/ ...
- ICP 匹配定位算法学习记录
icp 算法原理是: 选取目标点云P和源点云Q,按照一定的约束条件,找到最邻近点(pi,qi),然后计算出最优R和t(旋转和平移), 使得误差函数最小,误差函数E(R,t): 基本算法流程: 1.在目 ...
- app版本升级的测试点
移动端版本更新升级是一个比较重要的功能点,主要分为强制更新和非强制更新. 1.强制更新需要测试的点有: 1)强制升级是否可以升级成功 从老版本的包升级到新版版的包是否可以升级成功. 2)升级后的数据是 ...
- C# 爬虫相关的、可供参考的开源项目
1. Abots https://github.com/sjdirect/abot/ 2. DotnetSpider https://github.com/dotnetcore/DotnetSpide ...
- AngleSharp 实战(03)之遍历内部子元素
文档地址:https://anglesharp.github.io/docs/Examples.html 直接贴代码了: using System; using System.Linq; using ...
- springboot 使用 freemarker 无法正常跳转的问题?
1.springboot 使用 freemarker 无法正常跳转的问题? 参考:https://blog.csdn.net/Lin_xiaofeng/article/details/79122053 ...
- c# 如何获取当前方法的调用堆栈
c# 调试程序时常常需要借助 call stack 查看调用堆栈,实际上通过code也可以获取: class Program { static void Main(string[] args) { T ...
- .NET同一个页面父容器与子容器通信方案
主界面: 关键主页面代码: <div id="EditDiv"> <iframe src="javascript:void(0)" id=&q ...
- JAVA性能监控与调优参考文档链接
JAVA性能监控与调优参考文档链接 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.htmlTroub ...
- ssh-agent的作用
明明在github上配置了ssh公钥,拉代码时却报错: sign_and_send_pubkey: signing failed: agent refused operation 解决方法:在~/.z ...