【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
12 2
0 1
1 3
10 1
6 2
12 1
11 3
5 2
12 4
2 2
7 2
输出样例:
1:
3
2:
4
数据范围:
思想:模拟
代码:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#define MAXN 100000
using namespace std;
int card[17],cnt,ans=5211314,T,n;
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void dfs(int pos)
{
if(pos>=ans)return;////////求有多少个单顺子
int k=0;
for(int i=3;i<=14;i++)
{
if(!card[i])k=0;
else{
k++;
if(k>=5){
for(int j=i;j>=j-k+1;j--)
card[j]--;
dfs(pos+1);
for(int j=i;j>=j-k+1;j--)
card[j]++;
}
}
}
k=0;
for(int i=3;i<=14;i++)////求有多少个双顺子
{
if(card[i]<2)k=0;
else{
k++;
if(k>=3)
{
for(int j=i;j>=i-k+1;j--)
card[j]-=2;
dfs(pos+1);
for(int j=i;j>=j-k+1;j--)
card[j]+=2;
}
}
}
for(int i=2;i<=14;i++)////三张牌的情况
{
if(card[i]<=3)
{
if(card[i]<3)continue;
card[i]-=3;
for(int j=2;j<=15;j++)////三张牌带一张牌
{
if(j==i||card[j]<1)continue;
card[j]--;
dfs(pos+1);
card[j]++;
}
for(int j=2;j<=15;j++)
{
if(j==i||card[j]<2)continue;////三张牌带两张牌
card[j]-=2;
dfs(pos+1);
card[j]+=2;
}
card[i]+=3;
}
else
{
card[i]-=3;
for(int j=2;j<=15;j++)
{
if(j==i||card[j]<1)continue;
card[j]--;
dfs(pos+1);
card[j]++;
}
for(int j=2;j<=15;j++)
{
if(j==i||card[j]<2)continue;
card[i]-=2;
dfs(pos+1);
card[j]+=2;
}
card[i] += 3;//三张带别的
card[i] -= 4;//四张带两个单张
for(int j = 2; j <= 15; ++j){
if(j == i || card[j] < 1) continue;
card[j]--;
for(int k = 2; k <= 15; ++k){
if(k == j || card[k] < 1) continue;
card[k]--;
dfs(pos+1);
card[k]++;
}
card[j]++;
}
for(int j = 2; i <= 14; ++j){////四张带两个对
if(j == i || card[j] < 2) continue;
card[j] -= 2;
for(int k = 2; k <= 14; ++k){
if(j == k || card[k] < 2) continue;
card[k] -= 2;
dfs(pos+1);
card[k] += 2;
}
card[j] += 2;
}
card[i] += 4;
}
}
for(int i=2;i<=15;++i)////考虑剩下的牌,每次都能一次出尽每种的所有牌
if(card[i])pos++;
ans=min(ans,pos);
}
int main()
{
T=read();n=read();
while(T--)
{
ans=2147483647;
memset(card,0,sizeof(card));
int ai,bi;
for(int i=1;i<=n;i++)
{
ai=read();bi=read();
if(ai==1)card[14]++;
else if(ai==0)card[15]++;
else card[ai]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
【luogu2668斗地主】模拟的更多相关文章
- [luogu2668] 斗地主
题面 这好像就是道**暴搜题, 由于可以回溯, 所以顺序其实没有多大的关系, 见代码吧... 具体代码 #include <iostream> #include <cstring ...
- Java基础知识强化之集合框架笔记71:模拟斗地主洗牌和发牌并对牌进行排序的案例
1. 模拟斗地主洗牌和发牌并对牌进行排序的原理图解: 2. 代码实现: 思路: • 创建一个HashMap集合 • 创建一个ArrayList集合 • 创建花色数组和点数数组 • 从0开始往HashM ...
- Java基础知识强化之集合框架笔记70:模拟斗地主洗牌和发牌(ArrayList)
1. 模拟斗地主洗牌和发牌 分析: A:创建一个牌盒 B:装牌 C:洗牌 D:发牌 E:看牌 2. 代码实现: package cn.itcast_03; im ...
- Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌
1.Map集合概述和特点 * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多 ...
- 模拟斗地主和学生管理系统 IO 版
1.模拟斗地主 public class PlayCards { public static void main(String[] args) { String[] color = {"黑桃 ...
- hdu 4930 斗地主恶心模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4930 就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸.问先手能否一次出完牌 ...
- Java 模拟斗地主
模拟斗地主 public class M1 { public static void main(String args[]) { DouDiZhu02(); } private static void ...
- java 模拟斗地主发牌洗牌
一 模拟斗地主洗牌发牌 1.案例需求 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...
- hdu4930 模拟斗地主
题意: 模拟斗地主,出牌有一下规则,1张,1对,3张,3带1,3带2,炸弹(包括两个猫),4带2,这写规则,没有其他的,然后给你两幅牌,只要第一个人出了一次牌对方管不上,那么或者第一个人 ...
随机推荐
- 解决python语言在cmd下中文乱码的问题
解决python语言在cmd下中文乱码的问题: a = "再见!"print (a.decode('utf-8').encode('gbk')) #解决在cmd下中文乱码的问题
- Go语言之依赖管理
Go语言之依赖管理 Go语言的依赖管理随着版本的更迭正逐渐完善起来. 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面.这就导致了同一个库只能保存一个 ...
- Python文件操作——读写图片,音频,视频
注意:其实就是将mode="rb"或者mode="wb",因为图片,视频,音频就是二进制进行读取,b 代表binary ,其他的和一般文件操作步骤一样,另外, ...
- C#添加带验证的websevice接口
记录一下,方便下次使用,或者能帮助到别人. 一.添加服务引用,输入WSDL文件地址. 二.代码 public TESTClient TestContext() { var binding = new ...
- .net Core 图片验证码 基于SkiaSharp实现
public class ImageCaptcha { /// <summary> /// 干扰线的颜色集合 /// </summary> private List<SK ...
- 【php设计模式】装饰器模式
装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装饰类的基本类型. ConcreteComponent为具体实现类 ...
- 【SpringBoot】自动配置
一.取值 1.1 @Value 1.2 ConfigurationProperties 二.导入配置文件 2.1 @PropertySource 三.配置文件的加载 3.1 默认的加载顺序 3.2 外 ...
- dedecms Fatal error: Out of memory
max_execution_time = 300 php执行持续最长时间 比如:网站全站更新max_input_time = 30 php传送数据最长时间 比如:上传大文件memory_l ...
- 不重启linuxVMWare虚拟机添加虚拟光驱、硬盘
方法/步骤1: VMware找到要添加虚拟光驱位置,先右击点击设置,如图所示: 步骤2: 出现此界面之后点击添加: 步骤3: 直接点击下一步,如下图所示: 点击完成,天机硬盘就完毕了. 磁盘添加完成, ...
- 关于SendMessage和PostMessage的理解的例子
对于SendMessage 和 PostMessage 平时口头的解释是 SendMessage 发送消息后等待返回, PostMessage 发送消息后立即返回 . 但是这样解释还是不具体,什么叫等 ...