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

#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. elasticsearch搜索引擎搭建

    在该路径下,运行elasticsearch.bat该命令,后面访问127.0.0.1:9200 出现如下界面说明启动成功 elasticsearch-head操作elasticsearch的图形界面, ...

  2. html 弹框 优化 alert

    <!DOCTYPE html> <html> <head> <title>cs</title> </head> <styl ...

  3. CentOS(Linux)安装KETTLE教程 并配置执行定时任务

    1,首先是安装jdk,并设置环境变量 采用yum安装可不设置环境变量 2,下载kettle https://sourceforge.net/projects/pentaho/files/Data%20 ...

  4. 洛谷(P1006 传纸条)

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...

  5. shell重温---基础篇(连接数据库)

    前几天分享了shell字符串操作,数组操作等,接下来回归到项目,进行数据库操作.按照一般情况来说,shell连接数据库基本上都是DB使用的,因为需要运行大量的sql啊什么的,所以都会封装到shell中 ...

  6. JSON初体验(一):JsonObject解析

    在学校的呆了一段时间,马上又要回去工作了,不说了,我现在介绍一下json相关的内容 1.JSON数据格式(总的来说,json就是一个字符串) 1.整体结构 String json1 = "{ ...

  7. 三种urllib实现网页下载,含cookie模拟登陆

    coding=UTF-8 import re import urllib.request, http.cookiejar, urllib.parse # # print('-------------- ...

  8. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(二):Apache安装和配置

    基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...

  9. 活动的生命周期 Android

    1.运行程序 onCreate().onStart()和 onResume() 2.跳转到非弹框视图控制器 onPause()和 onStop() 返回上一个视图控制器(没被回收) onRestart ...

  10. 步骤:asp.net core中使用identifyserver4颁发令牌

    使用IdentityServer4颁发令牌基本步骤如下: 在 Startup.Configure 方法调用 app.UseIdentityServer ,添加IdentityServer4到应用的 H ...