整个模拟的关键除了打出来就是一个剪枝:对于两个左右相邻的块你不用再走←,因为走→是等效的

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#define r register
using namespace std;
int f[][][];
int s[][];
bool die[][];
int n;
bool god;
inline void Init()
{
scanf("%d",&n);
for(int i=,x;i<=;i++)
while()
{
scanf("%d",&x);
if(x==)break;
f[][i][++f[][i][]]=x;
}
}
void arrange(int h,int x,int y,int t)
{
s[h][]=x;
s[h][]=y;
s[h][]=t;
memcpy(f[h],f[h-],sizeof(f[h]));
f[h][x][y]^=f[h][x+t][y]^=f[h][x][y]^=f[h][x+t][y];
if(!f[h][x][y])++f[h][x+t][],--f[h][x][];
if(f[h][x][y]==&&f[h][x][y+]!=)
{
r int j=y+;
while(f[h][x][j]!=)
f[h][x][j-]^=f[h][x][j]^=f[h][x][j-]^=f[h][x][j],++j;
}
if(f[h][x+t][y-]==)
{
r int j=y-;
while(f[h][x+t][j]==)
f[h][x+t][j]^=f[h][x+t][j+]^=f[h][x+t][j]^=f[h][x+t][j+],--j;
}
r int get;
do
{
get=;
for(r int i=;i<=;++i)
for(r int j=;j<=f[h][i][];++j)
{
r int k=;
while(f[h][i][j]==f[h][i][j+k])++k;
if(k>=)
{
for(int l=;l<k;++l)
die[i][j+l]=;
}
j+=k-;
}
for(r int i=;i<=;++i)
for(r int j=;j<=;++j)
{
if(f[h][j][i]==)continue;
r int k=;
while(f[h][j][i]==f[h][j+k][i])++k;
if(k>=)
{
for(int l=;l<k;l++)
die[j+l][i]=;
}
j+=k-;
}
for(r int i=;i<=;++i)
for(r int j=;j<=f[h][i][];++j)
if(die[i][j])
f[h][i][j]=,die[i][j]=;
for(r int i=;i<=;++i)
{
r int k=;
for(r int j=;j<=f[h][i][];++j)
if(f[h][i][j])f[h][i][++k]=f[h][i][j];
else ++get;
for(r int j=k+;j<=f[h][i][];++j)f[h][i][j]=;
f[h][i][]=k;
}
}while(get);
}
void dfs(int x)
{
if(x==n)
{
r int sum=;
for(r int i=;i<=;++i)sum+=f[x][i][];
if(sum==)god=;
return;
}
for(r int i=;i<=;i++)
for(r int j=;j<=f[x][i][];j++)
{
if(i!=)
{
arrange(x+,i,j,);
dfs(x+);
if(god)return;
}
if(i!=&&f[x][i-][j]==)
{
arrange(x+,i,j,-);
dfs(x+);
if(god)return;
}
}
}
inline void work()
{
dfs();
if(god)
{
for(int i=;i<=n;i++)
printf("%d %d %d\n",s[i][]-,s[i][]-,s[i][]);
}
else
printf("-1");
}
int main()
{
Init();
work();
return ;
}

[COGS 622] [NOIP2011] 玛雅游戏 模拟的更多相关文章

  1. NOIP2011玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  2. [NOIP2011]玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  3. noip2011 玛雅游戏 大模拟

    深搜+模拟 需要剪枝:同一移动向右移了就不需要向左移了 #include<cstdio> #include<cstring> #include<iostream> ...

  4. 玛雅游戏[NOIP2011]

    题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  5. Luogu 1312 【NOIP2011】玛雅游戏 (搜索)

    Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...

  6. [NOIP2011] mayan游戏(搜索+剪枝)

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  7. Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝

    写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...

  8. [NOIP2011]Mayan游戏 题解

    题目大意: 有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落.每步移动可以且仅可以沿横向 ...

  9. 【ccf2017-12-2】游戏(模拟)

    问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋 ...

随机推荐

  1. No configuration found for this host:al

    想尝试多个agent来进行传输数据其中的一个配置文件如下: al.sources = r1al.sinks = k1al.channels = c1 al.sources.r1.type = avro ...

  2. 初识python 文件读取 保存

    上一章最后一题的答案:infors.sort(key=lambda x:x['age'])print(infors)--->[{'name': 'laowang', 'age': 23}, {' ...

  3. ffplay使用笔记

    ffplay播放yuv文件命令: ffplay -f rawvideo -video_size 1920x1080 a.yuv   ffplay播放mp4.h.264.hevc文件命令: ffplay ...

  4. Hive 函数之内置运算符

    本章介绍Hive的内置运算符.在Hive有四种类型的运算符: 关系运算符 算术运算符 逻辑运算符 复杂运算符 关系运算符 这些操作符被用来比较两个操作数.下表描述了在Hive中可用的关系运算符: 运算 ...

  5. 什么是 Cookie

    什么是 Cookie? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递.Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息. 例如,如果在用 ...

  6. 初步学习pg_control文件之六

    接前文:初步学习pg_control文件之五 ,DB_IN_ARCHIVE_RECOVERY何时出现? 看代码:如果recovery.conf文件存在,则返回 InArchiveRecovery = ...

  7. 获取单片机唯一id(stm32获取单片机唯一id)

    stm32唯一id: 不同型号的stm32单片机,id不在同一地址上!具体地址可以通过用户手册中的Device electronic signature>Unique device ID reg ...

  8. linux 操作之一 如何在linux将本地数据*.sql文件导入到linux 云服务器上的mysql数据库

    liunx 版本ubuntu 16.4 mysql 版本  5.6 1)准备*.sql文件 (* 是准备导入的sql文件的名字) 2)liunx 远程客户端  SecureCRT 7.0 alt+p ...

  9. 激活Windows Server 2008R2

    1. 用管理员身份运行mini-KMS_Activator_v1.053_ENG 2. 点击倒数第二个菜单Activation Windows VL 选择数字1 下一步选择Y 不管后面报不报错 3. ...

  10. web开发微信文章目录

    Web开发微信文章目录 2015-12-13 Web开发 本文是Web开发微信的文章目录.通过目录查看文章编号,回复文章编号就能查看文章全文. 回复编号查看全文,搜索分类名可以获得该分类下的文章.   ...