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

#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. ionic 打包apk Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]

    错误日志如下: Built the following apk(s): /Users/hongye0/Documents/project/haitoujiaApp/platforms/android/ ...

  2. netty源码分析系列文章

    netty源码分析系列文章 nettynetty源码阅读netty源码分析  想在年终之际将对netty研究的笔记记录下来,先看netty3,然后有时间了再写netty4的,希望对大家有所帮助,这个是 ...

  3. NSOperation那点事儿

    1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...

  4. Android ImageSwitcher 配合Picasso解决内存溢出(OOM)问题

    最近项目中用到了 ImageSwitcher 来实现图片切换,使用起来很简单,但发现当图片比较大(超过了3M)时,程序出现了内存溢出(OOM)问题而崩溃了. 原因就是图片太大了,显示到 ImageVi ...

  5. 如何激活win10

    第一步:用管理员权限打开命令提示符: 第二步:输入命令---slmgr.vbs /upk                          (成功卸载了产品密钥) 第三步:slmgr /ipk NPP ...

  6. Python 3基础教程32-正则

    本文介绍Python的正则,通过本文介绍和一个练习,对正则有一个基本了解就可以. # 正则表达式 ''' 正则表达式是有一些特殊字符组成,能够帮你找到一些符合一定规则的字符串 先来了解几个符号所代表的 ...

  7. 用node是踩过的一些坑

    1.http.request抓取数据时,response的“data”回调事件返回的数据不完整 问题原因:因为“data"事件返回是chunk,就是说是一块块连续的数据 解决的办法:在”da ...

  8. TP5 急速上手 语法规则

    Tp5  规则 命名规范 目录和文件名采用‘小写+下划线’,并且以小写字母开头: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写 ...

  9. nginx初探,下载安装配置负载均衡

    上一篇我讲了正向代理和反向代理的概念,这个是为nginx做准备的前置技能,网上百度nginx可以知道nginx是什么: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/PO ...

  10. 【Linux运维】Centos7上借助ansible搭建LVS+Keepalived

    安装ansible 安装ansible: [root@localhost ~]# /etc/hosts 192.168.19.129 web129.yanglt.com web129 192.168. ...