题目描述:

输入格式:

输出格式:

输入样例:

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. S03_CH01_AXI_DMA_LOOP 环路测试

    S03_CH01_AXI_DMA_LOOP 环路测试 1.1概述 本课程是本季课程里面最简单,也是后面DMA课程的基础,读者务必认真先阅读和学习. 本课程的设计原理分析. 本课程是设计一个最基本的DM ...

  2. 【规律】A Rational Sequence

    题目描述 An infinite full binary tree labeled by positive rational numbers is defi ned by:• The label of ...

  3. 【转】STM32的FSMC详解

    STM32的FSMC真是一个万能的总线控制器,不仅可以控制SRAM,NOR FLASH,NAND FLASH,PC Card,还能控制LCD,TFT. 一般越是复杂的东西,理解起来就很困难,但是使用上 ...

  4. 植物大战僵尸:寻找召唤僵尸关键CALL

    实验目标:通过遍历寻找召唤僵尸的CALL,通过调用CALL出现自定义的僵尸,加速僵尸的出现. 僵尸CALL的遍历技巧: 我们可以通过僵尸出现在屏幕中的个数来遍历寻找僵尸出现的CALL 首先打开CE-& ...

  5. docker启动mysql 自定义配置文件

    命令行如下: docker run --name mysql56 -p : -v /home/mysql56/data:/var/lib/mysql -v /home/mysql56/conf:/et ...

  6. luogu题解 P3629 【[APIO2010]巡逻】树的直径变式

    题目链接: https://www.luogu.org/problemnew/show/P3629 分析 最近被众多dalao暴虐,这道题傻逼地调了两天才知道错哪 不过这题比较良心给你一个容易发现性质 ...

  7. 1.DOS常用命令

    d:+ 回车:盘符切换,进入D:盘 dir(directory):列出当前目录下的文件及文件夹md(make director):创建目录rd(remove director):删除目录(不能删除非空 ...

  8. VisualStudio2015 安装

    环境:Win10 64位 推荐安装顺序 IIS > Sqlserver > Asp.Net 启动安装程序(出现Logo后需要等待1到2分钟),选择安装路径(注意不要出现中文路径) 勾选需求 ...

  9. h5学习之表单

    <html> <head> <title>新型input类型及表单新元素</title> <meta charset="utf-8&qu ...

  10. 使用nodejs创建Marketing Cloud的contact数据

    源代码如下: var config = require("./mcConfig"); var request = require('request'); var url = con ...