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

#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. 日志框架Log4j

    log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布.Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中. Log4j是 ...

  2. Bad escape character ‘ygen’ 错误原因!

    ssh-keygen -t rsa -C “邮箱” ssh-keygen 命令中间没有空格,如果在ssh后面加上空格,会得到Bad escape character ‘ygen’.的错误.

  3. 675. Cut Off Trees for Golf Event

    // Potential improvements: // 1. we can use vector<int> { h, x, y } to replace Element, sortin ...

  4. linux下SVN CVS命令大全

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn: // 192.168. 1.1 / pro / doma ...

  5. 嵌入式框架Zorb Framework搭建四:状态机的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  6. stm32+lwip(五):以太网帧发送测试

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

  7. 安装sql server

    因为电脑中只有mysql数据库,所以昨天准备安装一个sql server.安装中出现了许多问题,首先第一遍的时候,安装组件中没有勾选管理工具这个选项,所以在最后的时候,文件夹中只有配置管理器,没有数据 ...

  8. Uber:中国市场两年内不考虑盈利,每年补贴10亿美金

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 微信H5支付 在其他浏览器调用微信支付

    微信H5支付的相关资料不是很多.不过步骤上来说不是很复杂 比公众号支付简单很多. 先上官方文档吧 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapt ...

  10. 2、Java并发编程:如何创建线程

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...