题面

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

具体代码

#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. HDU 1142

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. java遍历HashMap的高效方法

    https://stackoverflow.com/questions/46898/how-do-i-efficiently-iterate-over-each-entry-in-a-java-map

  3. 纪念Vamai

      知道Vamei这位博主去世的消息有些日子啦,在他的豆瓣主页也留下了只言片语,他写的协议森林让我印象深刻,在博客园也是我关注列表里的一位. 本来没打算写一篇文来说Vamei去世的事情,不过意外之是加 ...

  4. LINUX创建LVM、PV、VG、LV ORACLE服务器方案划分

    为裸盘分区 查看硬盘分区 fdisk -l 进入分区管理 fdisk /dev/sda 创建PV 创建PV pvcreate /dev/sda1 pvcreate /dev/sdb1 pvcreate ...

  5. 使用JSON实现分页

    使用JSON实现分页可直接用 Fenye.html <!DOCTYPE html> <html> <head> <title>JSON分页</ti ...

  6. css实现div不定宽高垂直水平居中解决方案

    在项目中我们经常能碰见然图片垂直水平居中,不定宽高的div垂直水平居中,等等~~ 现在我将介绍我所知道的几种用css来解决的几种方案. 1.父元素text-align:center;display:t ...

  7. elasticsearch 多列 聚合(sql group by)

    文档数据格式 {"zone_id":"1","user_id":"100008","try_deliver_t ...

  8. 专访周金可:我们更倾向于Greenplum来解决数据倾斜的问题

    周金可,就职于听云,维护MySQL和GreenPlum的正常运行,以及调研适合听云业务场景的数据库技术方案. 听云周金可 9月24日,周金可将参加在北京举办的线下活动,并做主题为<GreenPl ...

  9. Pig filter用法举例

    filter:过滤数据,只有符合特定条件的数据才会被保留下来,然后进入下一个数据流.   1)等值比较 filter data by $0 == 1 filter data by $0 != 1   ...

  10. leetCode题解之旋转数字

    1.题目描述 X is a good number if after rotating each digit individually by 180 degrees, we get a valid n ...