深搜+模拟

需要剪枝:同一移动向右移了就不需要向左移了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,bo[6][8],tot,a[6][6][8],b[6][3];
bool boo;
int print(int x){
printf("\n");
for(int i=0;i<5;i++){
for(int j=0;j<7;j++)
printf("%d ",a[x][i][j]);
printf("\n");
}
printf("\n");
return 0;
}
bool boooo[5]={0};
void fall(int step){
for(int i=0;i<5;i++){
int bottom=0;
while(a[step][i][bottom]) bottom++;
if(bottom>=7) continue;
for(int j=bottom;j<7;j++){
if(a[step][i][j]){
a[step][i][bottom++]=a[step][i][j];
a[step][i][j]=0;
}
}
}
}
bool wipe(int step){
boo=0; tot++;
for(int i=0;i<5;i++)
for(int j=2;j<7;j++){
if(!a[step][i][j]) break;
if(a[step][i][j]==a[step][i][j-1]&&a[step][i][j]==a[step][i][j-2])
bo[i][j]=bo[i][j-1]=bo[i][j-2]=tot;
}
for(int i=0;i<7;i++)
for(int j=2;j<5;j++){
if(!a[step][j][i]) break;
if(a[step][j][i]==a[step][j-1][i]&&a[step][j][i]==a[step][j-2][i])
bo[j][i]=bo[j-1][i]=bo[j-2][i]=tot;
}
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(bo[i][j]==tot){
a[step][i][j]=0;
boo=1;
}
return boo;
}
void move(int step,int x,int y,int pos){
swap(a[step][x][y],a[step][x+pos][y]);
fall(step);
while(wipe(step)==1)
fall(step);
}
void dfs(int step,int x,int y,int pos){
if(step>n) return;
if(step!=0){
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
a[step][i][j]=a[step-1][i][j];
move(step,x,y,pos);
b[step][0]=x;
b[step][1]=y;
b[step][2]=pos;
}
boo=0;
bool vis[6][8]={0};
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(a[step][i][j]){
boo=1;
if(i!=4){
dfs(step+1,i,j,1);
vis[i+1][j]=1;
}
if(i&&(!vis[i][j]))dfs(step+1,i,j,-1);
}
if(boo==0){
for(int i=1;i<=step;i++)
printf("%d %d %d\n",b[i][0],b[i][1],b[i][2]);
exit(0);
}
}
int main()
{
freopen("mayan.in","r",stdin);
freopen("mayan.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<5;i++){
int j=0;
while(scanf("%d",&a[0][i][j++])==1&&a[0][i][j-1]!=0){}
}
dfs(0,0,0,0);
printf("-1\n");
return 0;
}

noip2011 玛雅游戏 大模拟的更多相关文章

  1. NOIP2011玛雅游戏

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

  2. [NOIP2011]玛雅游戏

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

  3. [COGS 622] [NOIP2011] 玛雅游戏 模拟

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

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

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

  5. 玛雅游戏[NOIP2011]

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

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

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

  7. [noip2011 luogu1312] Mayan游戏(模拟)

    原题:传送门 大模拟- 两个剪枝: 1.如果左边不为空就不往左边走(因为一定不如左边的移到右边优) 2.如果相邻两颜色相同不需移动 当然也有别的小剪枝(我没写)比如如果当前某一颜色剩余块数满足1< ...

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

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

  9. Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)

    猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...

随机推荐

  1. tomcat 工作原理

    Tomcat原理 分类: TOMCAT2009-05-17 22:25 4366人阅读 评论(3) 收藏 举报 tomcatexceptionsocketstringservernull Tomcat ...

  2. flask开发过程中的常见问题

    1. 使用supervisorctl时报"http://localhost:9001 refused connection"错误 解决方法:使用supervisorctl时指定配置 ...

  3. js 逻辑运算符优化

    运算符的代码优化,可以精简代码,提高代码可读性 下面主要讨论下逻辑运算符与 &&, 或||. 示例: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭 ...

  4. Django中的原子事务相关注意事项

    Django中的原子事务支持(transaction.atomic)方式函数装饰器或者with语句,这种方式特别是前者和spring里面的AOP事务支持方式基本等同,当然其实质方式都是原始的try.. ...

  5. Ruby中如何复制对象 (deep clone)(转载)

    Ruby中如何复制对象 (deep clone) 用Ruby复制一个对象(object)也许没有你想像的那么容易. 今天我google了半天, 做个总结吧. 先从最简单的开始, b = a 是复制吗? ...

  6. codeforces——961B. Lecture Sleep

    本文为博主原创文章,未经允许不得转载. 我在csdn也同步发布了此文,链接 https://blog.csdn.net/umbrellalalalala/article/details/7989196 ...

  7. python 中的csv读写

    1.首先 import csv 2.读一个csv文件 data = open(filename) lines = csv.reader(data)  #reader 函数和 dirtreader函数的 ...

  8. 遍历php数组的几种方法

    第一.foreach() foreach()是一个用来遍历数组中数据的最简单有效的方法. <?php $urls= array('aaa','bbb','ccc','ddd'); foreach ...

  9. Java多线程:生命周期,实现与调度

    Java线程生命周期 Java线程实现方法 继承Thread类,重写run()方法 实现Runnable接口,便于继承其他类 Callable类替换Runnable类,实现返回值 Future接口对任 ...

  10. 源码安装xadmin及使用

    xadmin是django的第三方后台 我们也可以使用pip来安装,但是推荐使用源码安装. 因为有些新功能以及发布在GitHub上,但是还未发布到pypi上,我们就可以提取使用这些功能. 一.安装 1 ...