题目:https://www.luogu.org/problemnew/show/P1312

还是不擅长这种题,所以参考了一下TJ;

其实也很好搜,按字典序,先搜右移,再搜左移;

不交换相同颜色的两个格子,因为浪费;

左移就不交换了,避免重复,只有左边为空时左移;

写个处理下落的 fall 函数,再写个处理消格子的 refresh 函数(其中用到了 fall ),就可以方便地搜索了!

我存的是行和列,所以和坐标正好相反,一定要注意字典序的处理!

优美。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,mp[][][],ansx[],ansy[],ansm[];
bool vis[][];
void fall(int s)
{
for(int j=,sz;j<=;j++)
{
sz=;
for(int i=;i<=;i++)
if(mp[s][i][j])mp[s][++sz][j]=mp[s][i][j];
while(sz<)mp[s][++sz][j]=;//
}
}
void refresh(int s)
{
bool fl=;
while()
{
fl=; fall(s);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(!mp[s][i][j])continue;//
if(i<=&&mp[s][i][j]==mp[s][i+][j]&&mp[s][i][j]==mp[s][i+][j])
{
fl=;
vis[i][j]=vis[i+][j]=vis[i+][j]=;
}
if(j<=&&mp[s][i][j]==mp[s][i][j+]&&mp[s][i][j]==mp[s][i][j+])
{
fl=;
vis[i][j]=vis[i][j+]=vis[i][j+]=;
}
}
if(!fl)break;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(vis[i][j])mp[s][i][j]=,vis[i][j]=;
}
}
bool dfs(int s)
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)mp[s][i][j]=mp[s-][i][j];
refresh(s);
if(s>n)
{
for(int j=;j<=;j++)
if(mp[s][][j])return ;
return ;
}
for(int j=;j<=;j++)//字典序!
for(int i=;i<=;i++) if(mp[s][i][j])
{
if(j<&&mp[s][i][j]!=mp[s][i][j+])//
{
ansx[s]=i; ansy[s]=j; ansm[s]=;
swap(mp[s][i][j],mp[s][i][j+]);
if(dfs(s+))return ;
swap(mp[s][i][j],mp[s][i][j+]);
}
if(j>&&!mp[s][i][j-])//-1
{
ansx[s]=i; ansy[s]=j; ansm[s]=-;
swap(mp[s][i][j],mp[s][i][j-]);
if(dfs(s+))return ;
swap(mp[s][i][j],mp[s][i][j-]);
}
}
return ;
}
int main()
{
scanf("%d",&n);
for(int j=;j<=;j++)
for(int i=,x;i<=;i++)
{
scanf("%d",&x); if(!x)break;
mp[][i][j]=x;
}
if(dfs())//
{
for(int i=;i<=n;i++)
printf("%d %d %d\n",ansy[i]-,ansx[i]-,ansm[i]);//坐标!
}
else printf("-1\n");
return ;
}

洛谷 P1312 [ NOIP 2011 ] Mayan游戏 —— 搜索+模拟的更多相关文章

  1. NOIp 2011 mayan游戏 搜索

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

  2. [NOIp 2011]Mayan游戏

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

  3. NOIP 2011 Mayan游戏 大暴搜

    题目链接:https://www.luogu.org/problemnew/show/P1312 我的第一篇题解!! 当然感谢ZAGER 的提示,他的链接https://www.cnblogs.com ...

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

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

  5. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

  6. 洛谷P1378 油滴扩展(搜索)

    洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...

  7. 洛谷 P3951 NOIP 2017 小凯的疑惑

    洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...

  8. 洛谷P1312 Mayan游戏

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

  9. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

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

随机推荐

  1. Colletions工具类常用方法

    Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合 排序操作 void reverse(List list)/ ...

  2. 我的MYSQL学习心得链接

    http://www.cnblogs.com/lyhabc/p/3793524.html

  3. <MySQL>入门五 视图

    -- 视图 /* 含义:虚拟表,和普通的表一样使用 mysql5.1版本的新特性,是通过表动态生成的数据,只保存了sql的逻辑,不保存查询的结果 应用场景: - 多个地方用到同样的查询结果 - 该查询 ...

  4. Hadoop Mapreduce 中的Partitioner

    Partitioner的作用的对Mapper产生的中间结果进行分片,以便将同一分组的数据交给同一个Reduce处理,Partitioner直接影响Reduce阶段的负载均衡. MapReduce提供了 ...

  5. stall and flow separation on airfoil or blade

    stall stall and flow separation Table of Contents 1. Stall and flow separation 1.1. Separation of Bo ...

  6. java--删除链表偶数节点

    public class ListNode { int data;//当前节点的值 ListNode next = null;//是指向下一个节点的指针/引用 public ListNode(int ...

  7. 九度oj 题目1059:abc

    题目1059:abc 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4510 解决:3546 题目描述: 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc ...

  8. [luoguP1282] 多米诺骨牌(DP + 背包)

    传送门 将问题转换成分组背包,每一组有上下两个,每一组中必须选则一个,上面的价值为0,下面的价值为1,求价值最小 因为要求上下两部分差值最小,只需从背包大小为总数 / 2 时往前枚举,找最小答案即可. ...

  9. [luoguP2031] 脑力达人之分割字串(DP)

    传送门 想了个4次方算法,没想到也A了,数据真是水. 其实两个字符串匹配那部分可以用kmp优化 ——代码 #include <cstdio> #include <cstring> ...

  10. 实验吧-catalyst-system

    刚学逆向很多都不懂,本题也是在看了 http://countersite.org/articles/reverse_engineering/136-revers-s-alexctf-2017.html ...