【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,这写规则,没有其他的,然后给你两幅牌,只要第一个人出了一次牌对方管不上,那么或者第一个人 ...
随机推荐
- MySQL优化 - 性能分析与查询优化(转)
出处: MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载 ...
- 用Lua的协程实现类似Unity协程的语句块
local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...
- idea中创建的go项目,添加project sdk时没有go sdk选项的解决方式
同样是后端开发,年薪50万和年薪20万的差距在哪里>>> 更新: 为了防止你被我这个流水账气到,先看这个结论吧:这个问题的结局方法:忽略,没有什么影响. -------------- ...
- 8-MySQL DBA笔记-测试基础
第三部分 测试篇 测试需要掌握的知识面很广泛,本篇的关注点是数据库的性能测试和压力测试,对于其他领域的测试,由于涉猎不多,笔者就不做叙述了.DBA的工作职责之一就是评估软硬件,这往往是一项很耗时的工作 ...
- Myatis中的OGNL和bind标签的结合用法
1.MyBatis常用的OGNL e1 or e2 e1 and e2 e1 == e2,e1 eq e2 e1 != e2,e1 neq e2 e1 lt e2:小于 e1 lte e2:小于等于, ...
- StoneTab标签页CAD插件 3.2.1
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- 深入JavaScript对象(Object)与类(class),详细了解类、原型
JavaScript基于原型的对象机制 JavaScript原型上的哪些事 一.JavaScript基于原型的对象机制 JavaScript对象是基于原型的面向对象机制.在一定程度上js基于原型的对象 ...
- wepy2创建项目
1.首先 在桌面(自己选定目录下)新建一个文件夹,注意需要使用英文名. 2.Cmd中 进入到该文件目录下 3.安装 wepy 命令行工具. npm install wepy-cli -g wepy ...
- VirtualBox使用
热键:Right Ctrl 串口 端口编号: COM1 -> /dev/ttyS0 COM2 -> /dev/ttyS1 COM3 -> /dev/ttyS2 COM4 -> ...
- Vue移动端焦点状态跳转页面,焦点和键盘不消失的问题
问题:input搜索,在移动端焦点状态跳转页面,焦点不失焦,还在跳转后的页面闪烁,且键盘不消失 //主动隐藏键盘 document.getElementById('inputSearch').blur ...