题面

​ 这好像就是道**暴搜题, 由于可以回溯, 所以顺序其实没有多大的关系, 见代码吧...

具体代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; int T, n, cnt[20], ans; inline int read()
{
int x = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') { if(c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
} void dfs(int); void SHUN(int x, int y, int step)
{
int k = 0;
for(int i = 1; i <= 12; i++)
{
if(cnt[i] < x) k = 0;//如果中间断开了就需要重新计算了, 难道你打顺子还打一个3,4,5,7,8,9,10吗??? 你会被和你一起打牌的人群殴一顿了...
else
{
k++;
if(k >= y)
{
for(int j = i; j >= i - k + 1; j--) cnt[j] -= x;
dfs(step + 1);
for(int j = i; j >= i - k + 1; j--) cnt[j] += x;
}
}
}
} void DAI3(int x, int y, int step, int num)
{
for(int j = 1; j <= y; j++)
{
if(cnt[j] < x || j == num) continue;
cnt[j] -= x;
dfs(step + 1);
cnt[j] += x;
}//搜索和回溯, 不会的话去请你的教练给你复习一下吧
} void DAI4(int x, int y, int step, int num)
{
for(int i = 1; i <= y; i++)//范围
{
if(cnt[i] < x || i == num) continue;
cnt[i] -= x;
for(int j = 1; j <= y; j++)
{
if(cnt[j] < x) continue;
//两张单牌应该可以打一样的吧...
cnt[j] -= x;
dfs(step + 1);
cnt[j] += x;
}
cnt[i] += x;
}//还是搜索与回溯
} void dfs(int step)
{
if(step >= ans) return;
SHUN(3, 2, step); SHUN(2, 3, step); SHUN(1, 5, step);
//顺子SHUN(x,y,step)x的意思是顺子是几顺子, 也就是每张牌有多少张, y的意思是最少要几个连着的牌, 例如说单顺子就是五张起打嘛, step就是当前已经打了几次牌了...
for(int i = 1; i <= 13; i++)
{
if(cnt[i] <= 3)//带牌, 三带一之类的, DAI3(x,y,step,i)意思是带x张牌, 牌的范围是y, 我也不知道三带一为什么可以带个鬼, step同上, i是不能被重复用的牌, 你不可能把自己给带上吧...
{
if(cnt[i] <= 2) continue;
cnt[i] -= 3;
DAI3(1, 14, step, i); DAI3(2, 13, step, i);
cnt[i] += 3;
}
else
{
cnt[i] -= 4; //如果有四张牌的话可以打四张
DAI4(1, 14, step, i); DAI4(2, 13, step, i);//意思与上面DAI3差不多,就是x的意思有点不一样, 1是带两种单牌, 2是带两对对子...
cnt[i] += 1;//有四张牌的话当然可以打三张了啦
DAI3(1, 14, step, i); DAI3(2, 13, step, i);//同上DAI3解释
cnt[i] += 3;
}
}
for(int i = 1; i <= 14; i++) if(cnt[i]) step++; //带的, 顺子都打完了之后就只有单牌,对子,三张牌,炸弹和王炸了, 每个打出去就行了, 不管他是一张两张或者三张四张, 都可以一次性打完, 哦也
ans = min(ans, step); //更新答案数组
} int main()
{
T = read(); n = read();
while(T--)
{
memset(cnt, 0, sizeof(cnt));
for(int i = 1; i <= n; i++)
{
int x = read(), y = read();
if(x == 0) x = 14;//x是大小鬼, 放在最大的十四的位置
else if(x == 1 || x == 2) x += 11;//x是A或者2, 放在12和13的位置
else if(x >= 3 && x <= 13) x -= 2;//其他的-=2
cnt[x]++;
//有没有发现, 其实是按牌的大小从小到大排列的, 毕竟扑克中是3,4,5,6,7,8,9,10,J,Q,K,A,2,鬼,
//其实是这样子好找顺子...
}
ans = n; dfs(0);
printf("%d\n", ans);
}
//这道题其实就是考的细心, 好好写一下就好了...
return 0;
}

​ 但是似乎过不了数据加强版, 吸氧也过不了, 自己再去剪点枝吧...

[luogu2668] 斗地主的更多相关文章

  1. 【luogu2668斗地主】模拟

    题目描述: 输入格式: 输出格式: 输入样例: 1: 1 8 7 4 8 4 9 1 10 4 11 1 5 1 1 4 1 1 2: 1 17 12 3 4 3 2 3 5 4 10 2 3 3 1 ...

  2. NOIP2015斗地主[DFS 贪心]

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

  3. Android斗地主棋牌游戏牌桌实现源码下载

    本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...

  4. Android开源益智游戏“斗地主”单机版源代码

     Android开源益智游戏"斗地主"单机版源代码 这是一个网上流传的Android开源斗地主单机版项目,运行结果如图: 项目源代码导入到Eclipse后可直接运行,我把ecl ...

  5. [NOIP2015] 斗地主(搜索)

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

  6. Java基础之如何解决斗地主问题

        难的是逻辑的分析,把逻辑转化成代码是一种能力,这种能力需要多练习总结.     多多指教,共同进步. 问题: 要求实现斗地主游戏发牌过程,打印三个玩家的牌和底牌.在不看底牌的情况下,统计出三个 ...

  7. Java写的斗地主游戏源码

    源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...

  8. 斗地主(Noip2015Day1T3)

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

  9. BZOJ 4325: NOIP2015 斗地主

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 684  Solved: 456[Submit][Status] ...

随机推荐

  1. JVM GC总结

    判断对象存活 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1,引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 问题:无法解决对象之间的相互循 ...

  2. YII使用beanstalk队列

    转载于:http://blog.csdn.net/yao970953039/article/details/41821387 1.系统centos 我是直接使用yum install beanstal ...

  3. Navicat MySql乱码解决

    接着上一篇博客继续解决 如上图,鼠标放在localhost上右键,选择编辑连接,弹出下图. 如下选择好之后,连接数据库,进行测试.在test数据库上右键选择命令列界面,如下图,输入show varia ...

  4. Docker for Windows(三)Docker镜像与容器的区别&常用命令

    Docker镜像(Image)是一堆只读文件(read-only layer),容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是 ...

  5. Laravel 支付宝异步通知 419报错

    支付宝在支付是有服务器通知和网页通知,一个在前端展示,一个在后台操作, laravel框架自带csrf_token验证. 所以我们需要把支付的路由跳过验证 可以在中间键的csrf配置中更改

  6. CentOS /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

    使用的时候出现一个错误 bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or direc ...

  7. python代码打包发布

    背景 本文介绍了python中一种最简单的代码结构的打包方式 包名称 我们先给我们的包取个名字,python包起名需要符合下面的规范 全部小写 在pypi上是唯一的 下划线分隔或没有单词分隔符(不要使 ...

  8. ulimit命令&pthread_create() error: Resource temporarily unavailable

    http://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/ https://my.vertica.com/docs/5.0/HTML/Master/ ...

  9. Java类的封装

    java中四种不同的限定词限定的成员(成员变量或成员变量方法),访问权限由大到小依次为: public(公共的) 可以被所有的类访问 protected(受保护的) 可以被这个类本身访问 可以被它的子 ...

  10. PHP获取用户的真实IP地址

    本文出至:新太潮流网络博客 PHP获取用户的真实IP地址,非代理IP function getClientIP(){ global $ip; if(getenv("HTTP_CLIENT_I ...