2106. [NOIP2015] 斗地主

★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比
时间限制:2 s  
内存限制:1025 MB

【题目描述】

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。

现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。

需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。

具体规则如下:

【输入格式】

第一行包含用空格隔开的2个正整数Tn,表示手牌的组数以及每组手牌的张数。

接下来T组数据,每组数据n行,每行一个非负整数对aibi表示一张牌,其中ai示牌的数码,bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。

【输出格式】

共T行,每行一个整数,表示打光第i手牌的最少次数。

【样例输入1】

1 8
7 4
8 4
9 1
10 4
11 1
5 1
1 4
1 1

【样例输出1】

3

【样例输入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

【样例输出2】

6

【提示】

样例1说明

共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。

对于不同的测试点, 我们约定手牌组数T与张数n的规模如下:

数据保证:所有的手牌都是随机生成的。

【来源】

在此键入。

这个题,,我不想多吐槽什么。。。。。。

323行,四个小时,记录...

虽然一开始就看出是暴力搜索了,,但是我写的是BFS,,从来没人AC的BFS。。

好吧我也没AC不过拿了85分。。实在是没什么好优化的了。(传说可以加贪心)

这道题的深搜,我想留到noip2017前夕写。

留个纪念

思路:

暴力枚举所有可能出现的情况

That all

代码略长,留给以后的自己,请勿吐槽

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
const int MAXN=;
int T,n,pai_num,meiyong;
int pai[MAXN];
map<string,bool>mp;
int js=;
struct node
{
int a[];
int step;
}now,nxt;
queue<node>q;
int ans=0x7ffff;
inline int pdvis(node p)
{
string gg;
for(int i=;i<=;i++)
gg=gg+(char)(p.a[i]-);
if(mp[gg]==)return ;
else
{
mp[gg]=;
return ;
}
}
int read(int & n)
{
char c=getchar();
int x=,flag=;
while(c<''||c>'')
{if(c=='-')flag=;
c=getchar();}
while(c>=''&&c<='')
x=x*+(c-),c=getchar();
if(flag==)n= -x;
else n= x;
}
inline void init()
{
mp.clear();
memset(pai,,sizeof(pai));
memset(now.a,,sizeof(now));
memset(nxt.a,,sizeof(nxt));// 多组数据
for(int i=;i<=n;i++)
{
read(pai_num);read(meiyong);
if(pai_num==)pai_num=;// A
if(pai_num==)pai_num=;//
if(pai_num==)
{
if(meiyong==)pai_num=;// 小王
else if(meiyong==)pai_num=;
}
pai[pai_num]++;
}
}
inline void pd_danshun(node p)
{
int num=;
for(int i=;i<=;i++)
{
if(p.a[i]>=)
{
num=;
for(int j=i+;j<=;j++)
{
if(p.a[j]>=)
num++;
else
break;
}
if(num>=)
{
for(int j=i;j<=i+num-;j++)
p.a[j]--;
for(int j=;j<=;j++)
nxt.a[j]=p.a[j];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
for(int j=i;j<=i+num-;j++)
p.a[j]++;
}
} }
}
inline void pd_shuangshun(node p)
{
int num=;
for(int i=;i<=;i++)
{
if(p.a[i]>=)
{
num=;
for(int j=i+;j<=;j++)
{
if(p.a[j]>=)
num++;
else
break;
}
if(num>=)
{
for(int j=i;j<=i+num-;j++)
p.a[j]=p.a[j]-;
for(int j=;j<=;j++)
nxt.a[j]=p.a[j];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
for(int j=i;j<=i+num-;j++)
p.a[j]=p.a[j]+;
}
}
}
}
inline void pd_sanshun(node p)
{
int num=;
for(int i=;i<=;i++)
{
if(p.a[i]>=)
{
num=;
for(int j=i+;j<=;j++)
{
if(p.a[j]==)
num++;
else
break;
}
if(num>=)
{
for(int j=i;j<=i+num-;j++)
p.a[j]=p.a[j]-;
for(int j=;j<=;j++)
nxt.a[j]=p.a[j];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
for(int j=i;j<=i+num-;j++)
p.a[j]=p.a[j]+;
}
}
}
}
inline void pd_three(node p)
{
for(int i=;i<=;i++)
{
if(p.a[i]==)
{
for(int j=;j<=;j++)
{
if(i!=j&&(p.a[j]==||p.a[j]==))
{
int tmp=p.a[j];
p.a[i]=;
p.a[j]=;
for(int k=;k<=;k++)
nxt.a[k]=p.a[k];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
p.a[i]=;
p.a[j]=tmp;
}
}
p.a[i]=;
for(int l=;l<=;l++)
nxt.a[l]=p.a[l];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
p.a[i]=;
}
}
}
inline void pd_boom(node p)
{
for(int i=;i<=;i++)
{
if(p.a[i]==)
{
for(int ll=;ll<=;ll++)
{
for(int rr=;rr<=;rr++)
{
if((p.a[ll]==&&p.a[rr]==&&ll!=rr)||(p.a[ll]==&&p.a[rr]==&&ll!=rr))
{
int tmp=p.a[ll];
p.a[i]=;
p.a[ll]=;
p.a[rr]=;
for(int kkk=;kkk<=;kkk++)
nxt.a[kkk]=p.a[kkk];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
p.a[i]=;
p.a[ll]=tmp;
p.a[rr]=tmp;
}
}
}
p.a[i]=;
for(int l=;l<=;l++)
nxt.a[l]=p.a[l];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
p.a[i]=;
}
}
}
inline void pd_other(node p)
{
for(int i=;i<=;i++)
{
if(i==)
{
if(p.a[i]==p.a[i+]&&p.a[i]!=)
{
p.a[i]=;
p.a[i+]=;
for(int l=;l<=;l++)
nxt.a[l]=p.a[l];
nxt.step=p.step+;
if(pdvis(nxt))
q.push(nxt);
p.a[i]=;
p.a[i+]=;
continue;
}
}
if(p.a[i]==||p.a[i]==)
{
int tmp=p.a[i];
p.a[i]=;
for(int l=;l<=;l++)
nxt.a[l]=p.a[l];
nxt.step=p.step+; if(pdvis(nxt))
q.push(nxt);
p.a[i]=tmp;
}
} }
inline void chushihua()
{
for(int i=;i<=;i++)
nxt.a[i]=;
}
inline int findans(node p)
{
for(int i=;i<=;i++)
if(p.a[i]!=)
return ;
return ;
}
inline void gaoall(node p)
{
pd_boom(p);// 炸弹
chushihua();// 初始化
pd_danshun(p);// 单顺子
pd_shuangshun(p);// 双顺子
pd_sanshun(p);// 三顺子
pd_three(p);// 三
pd_other(p);// 单,对,大小王
}
void bfs()
{
js=;
for(int i=;i<=;i++)
now.a[i]=pai[i];
now.step=;
while(q.size()!=)
q.pop();
ans=0x7ffff;
q.push(now);
while(q.size()!=)
{
node p=q.front();
q.pop();
gaoall(p);
if(findans(p)==)
{
ans=min(ans,p.step);
js++;
if(js>=)
break;
}
}
}
int main()
{
freopen("landlords.in","r",stdin);
freopen("landlords.out","w",stdout);
read(T);read(n);
while(T--)
{
init();
/* for(int i=1;i<=17;i++)cout<<i<<" ";
cout<<endl;
for(int i=1;i<=17;i++)cout<<pai[i]<<" ";
cout<<endl;*/
bfs();
// if(ans==2)
// printf("\n%d*%d\n",T,n);
printf("%d\n",ans);
} return ;
}

2106. [NOIP2015] 斗地主的更多相关文章

  1. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  2. NOIP2015斗地主[DFS 贪心]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  3. BZOJ 4325: NOIP2015 斗地主

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 684  Solved: 456[Submit][Status] ...

  4. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  5. LOJ2422 NOIP2015 斗地主 【搜索+贪心】*

    LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...

  6. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝

    [BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...

  7. NOIP2015斗地主题解 7.30考试

    问题 B: NOIP2015 斗地主 时间限制: 3 Sec  内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...

  8. [NOIP2015] 斗地主(搜索)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  9. NOIP2015斗地主(搜索+模拟+贪心)

    %%%Luan 题面就不说了,和斗地主一样,给一组牌,求最少打几次. 注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的. 枚举方法,每次搜索按照(三顺子>二顺子>普 ...

随机推荐

  1. hadoop(2)hadoop配置

    hadoop入门(二) hadoop的配置 1.本地模式 2.伪分布式 3.分布式     一.配置linux环境: 1打开虚拟网络编辑器,选择 VMnet1 仅主机模式, 子网 IP 设为 192. ...

  2. Ext-js使用指南(总结)

    一.获取元素(Getting Elements) 1.Ext.get var el = Ext.get('myElementId');//获取元素,等同于document.getElementById ...

  3. TensorFlow-GPU环境配置之一——安装Ubuntu双系统

    本机已经安装过Windows系统,准备安装Ubuntu双系统进行TensorFlow相关工作,需要在windows中将磁盘分出一定空间供Ubuntu使用 1.首先下载Ubuntu17.04版本ISO ...

  4. Linux纯Shell实现DNSPod动态域名

    http://www.anrip.com/post/872 开发背景: 公司有台嵌入式拨号上网设备,内置busybox和完整wget命令(支持https协议),但没有curl.python.ruby. ...

  5. [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS

    Using Object Oriented Programming, OOP, style allows us to apply Inversion of Control, IoC, and more ...

  6. react 项目实战(六)提取布局组件

    重复代码是混乱的根源!,本篇文章我们来继续消灭重复代码. 目标 细心的同学应该能发现:每一个Page组件(/src/pages下的组件)的render方法都拥有相似的jsx结构,比如: render ...

  7. EXCEL单元格的获取——多例模式

    因为Excel的单元格的行列与单元格是一一相应的,行与列组成的是一对联合主键.给定一个单元格行列或者给定一个单元格名称.须要找到相应的单元格:这样就形成了一种映射关系.须要使用单例模式的变式--多例模 ...

  8. jmeter实现Http接口测试介绍

    构建一个测试页面 页面功能测试说到底就是模拟用户浏览点击页面的全过程,很多的测试工具都可以对该过程进行录制后模拟用户操作,而压力测试就是将这个过程在单位时间内重复成千上万次,看检测应用的高可用,接下来 ...

  9. 卷积神经网络-进化史】从LeNet到AlexNet

    目录视图 摘要视图 订阅 [置顶] [卷积神经网络-进化史]从LeNet到AlexNet 标签: cnn 卷积神经网络 深度学习 2016年05月17日 23:20:3046038人阅读 评论(4)  ...

  10. 2016/2/19 position: fixed absolute relative z-index float 半透明效果

    一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口.      显示效果  无论滚动条怎么移动  都固定在显示页面的一个位置不动 二.position:a ...