题目描述:

输入格式:

输出格式:

输入样例:

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斗地主】模拟的更多相关文章

  1. [luogu2668] 斗地主

    题面 ​ 这好像就是道**暴搜题, 由于可以回溯, 所以顺序其实没有多大的关系, 见代码吧... 具体代码 #include <iostream> #include <cstring ...

  2. Java基础知识强化之集合框架笔记71:模拟斗地主洗牌和发牌并对牌进行排序的案例

    1. 模拟斗地主洗牌和发牌并对牌进行排序的原理图解: 2. 代码实现: 思路: • 创建一个HashMap集合 • 创建一个ArrayList集合 • 创建花色数组和点数数组 • 从0开始往HashM ...

  3. Java基础知识强化之集合框架笔记70:模拟斗地主洗牌和发牌(ArrayList)

    1. 模拟斗地主洗牌和发牌 分析:     A:创建一个牌盒     B:装牌     C:洗牌     D:发牌     E:看牌 2. 代码实现: package cn.itcast_03; im ...

  4. Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌

    1.Map集合概述和特点 * A:Map接口概述  * 查看API可以知道:          * 将键映射到值的对象          * 一个映射不能包含重复的键          * 每个键最多 ...

  5. 模拟斗地主和学生管理系统 IO 版

    1.模拟斗地主 public class PlayCards { public static void main(String[] args) { String[] color = {"黑桃 ...

  6. hdu 4930 斗地主恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4930 就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸.问先手能否一次出完牌 ...

  7. Java 模拟斗地主

    模拟斗地主 public class M1 { public static void main(String args[]) { DouDiZhu02(); } private static void ...

  8. java 模拟斗地主发牌洗牌

    一 模拟斗地主洗牌发牌 1.案例需求 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...

  9. hdu4930 模拟斗地主

    题意:        模拟斗地主,出牌有一下规则,1张,1对,3张,3带1,3带2,炸弹(包括两个猫),4带2,这写规则,没有其他的,然后给你两幅牌,只要第一个人出了一次牌对方管不上,那么或者第一个人 ...

随机推荐

  1. Python基础 第四章 字典(2)字典方法&章小结

    1. clear 方法clear删除所有的字典项,就地执行,什么都不返回(或者说返回None) d = {} d['name'] = 'Gumby' d['age'] = 42 print(d) re ...

  2. MongoDB环境搭建

    MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...

  3. linux系统安全设置加固

        描述 设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险 检查提示 -- 加固建议 编辑/etc/ssh/sshd_config,将ClientAliveInterval ...

  4. react的状态管理

    近两年前端技术的发展如火如荼,大量的前端项目都在使用或转向 Vue 和 React 的阵营, 由前端渲染页面的单页应用占比也越来越高,这就代表前端工作的复杂度也在直线上升,前端页面上展示的信息越来越多 ...

  5. Js 判断数组中是否包含某个值

    includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. JavaScript Array includes() 方法

  6. 逗渣的学习笔记-关于webpack从头撸一遍

    刚开始接触webpack,完全是工作需求.那是去年年末的事情了,当时被迫换到另一个项目组,也是一个新的项目,做手机上面的应用,客户要求用react做应用,所以完全属于赶鸭子上架,当时说真的蛮懵逼的,也 ...

  7. split分离特殊字符

    Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ ) \b  \t  \n  \f  \r  \ ...

  8. HashMap闭环(死循环)的详细原因(转)

    为何出现死循环简要说明 HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%. HashMap采用链表解决Hash ...

  9. 用最简单的代码写出banner图轮播效果

    以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html

  10. Hadoop_20_MapReduce程序的运行模式

    1.MapReduce程序的运行模式 1. Windows中运行MapReduce程序 (1)mapreduce程序是被提交给LocalJobRunner在本地以单进程的形式运行 (2)而处理的数据及 ...