[luogu2668] 斗地主
题面
这好像就是道**暴搜题, 由于可以回溯, 所以顺序其实没有多大的关系, 见代码吧...
具体代码
#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] 斗地主的更多相关文章
- 【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 ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- Android斗地主棋牌游戏牌桌实现源码下载
本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...
- Android开源益智游戏“斗地主”单机版源代码
Android开源益智游戏"斗地主"单机版源代码 这是一个网上流传的Android开源斗地主单机版项目,运行结果如图: 项目源代码导入到Eclipse后可直接运行,我把ecl ...
- [NOIP2015] 斗地主(搜索)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- Java基础之如何解决斗地主问题
难的是逻辑的分析,把逻辑转化成代码是一种能力,这种能力需要多练习总结. 多多指教,共同进步. 问题: 要求实现斗地主游戏发牌过程,打印三个玩家的牌和底牌.在不看底牌的情况下,统计出三个 ...
- Java写的斗地主游戏源码
源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...
- 斗地主(Noip2015Day1T3)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
随机推荐
- [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法
环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...
- PHP网站(Drupal7)响应过慢之“Wating(TTFB)时间过长”
直接上图: 这是Chrome浏览器自带的工具分析的.整个url请求的时间为2.59秒,最大的耗时在Wating(TTFB, Time To First Byte),消耗了2.59秒(应该是其他时间太短 ...
- opencv3.2.0形态学滤波之形态学梯度、顶帽、黑帽
/*一.形态学梯度 (1)含义:是膨胀图和腐蚀图之差 (2)数学表达式:dst=morph-grad(src,element) =dilate(src,element) - erode(src,ele ...
- Vue项目中引用vue-resource步骤
直接上步骤: 1.通过命令,进入到当前项目所在目录 2.输入以下命令npm install vue-resource --save 3.安装完毕后,在main.js中导入,如下: import Vue ...
- oracle exp dmp
exp help=yconn scott/tiger;select * from tab;create table student(sno int, sname varchar2(10), sage ...
- Python Socket实现简单web服务器
#!/usr/bin/python env # coding:utf-8 import socket ip_port = ('127.0.0.1', 80) back_log = 10 buffer_ ...
- CMake中添加Qt模块的合理方法
https://www.jianshu.com/p/7eeb6f79a275 转载自这里 用CMake来组织的工程中要用Qt首先要设置.找到Qt相关模块.主要是通过find_package这个CMak ...
- Linux学习之CentOS(五)----网卡的配置
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Entity Framework 更新模式之Attach与EntityState.Modified模式的区别
数据库中有一个City表 初始时数据: 实体类与Fluent Api配置映射 public class City { public int Id { get; set; } public string ...
- 关于Entity Framework关系配置,提示列名XXXX_Id无效的问题
问题描述 : 数据库中有两张表,如下: Member(会员)表有外键RoleId,对应的是Role(角色)表的主键Id,业务逻辑是Member表的RoleId必须与Role表的Id对应(但在设计数据表 ...