题面

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

具体代码

#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. 湘潭校赛 Hard Wuxing

    Hard Wuxing Accepted : 13   Submit : 166 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 “五行”是中国 ...

  2. Bash:常用命令工具-tr命令

    tr命令可以用来做简单的字符替换与删除,常用的有-d, -s选项.它的替换与删除是按单个字符来的 假设有以下文本: Read from the file words.txt and output th ...

  3. LOJ#6271. 「长乐集训 2017 Day10」生成树求和 加强版

    传送门 由于是边权三进制不进位的相加,那么可以考虑每一位的贡献 对于每一位,生成树的边权相当于是做模 \(3\) 意义下的加法 考虑最后每一种边权的生成树个数,这个可以直接用生成函数,在矩阵树求解的时 ...

  4. bzoj P4825 [Hnoi2017]单旋——solution

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...

  5. PHP CURL库学习

    基本请求步骤 : // . 初始化 $ch = curl_init(); // . 设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www. ...

  6. opencv3.2.0图像离散傅里叶变换

    源码: ##名称:离散傅里叶变换 ##平台:QT5.7.1+opencv3.2.0 ##日期:2017年12月13. /**** 新建QT控制台程序****/ #include <QCoreAp ...

  7. Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug

    这几天eclipse 项目迁移 android studio Error:Execution failed for task ':app:transformClassesWithJarMergingF ...

  8. 132.1.001 Union-Find | 并查集

    @(132 - ACM | 算法) Algorithm | Coursera - by Robert Sedgewick > Tip: Focus on WHAT is really impor ...

  9. iphone使用linux命令apt-get也没有问题

    那么教程开始: 首先安装cydia这个越了yu就有自带的哦 然后添加源,比如apt.91.我忘了,大家可以在http://frank-dev-blog.club/?post=45找一个 查找termi ...

  10. hue简单介绍

    hue定义: HUE=Hadoop User Experience 个人理解:可视图的webui界面,方便大数据技术之间的CRUD操作. 官方定义:Hue是一个能够与Apache Hadoop交互的W ...