题目: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. Could not resolve type alias 'map '. Cause: java.lang.ClassNotFoundException: Cannot find class: map

    把resultType改为resultMap, 把parameterType改为parameterMap,重新发布并运行.

  2. C++ 迭代器运算符 箭头运算符->

    所有标准库容器都支持迭代器,只有少数几种才支持下标运算 迭代器运算符 运算符 作用 *iter 返回迭代器iter所指元素的引用 iter -> mem 解引用iter,并获取元素名为mem的成 ...

  3. BZOJ 4976 [Lydsy1708月赛]宝石镶嵌

    [题解] 我们设总共有m个二进制位出现过1,那么如果n-k≥m,显然所有的1都可以出现,那么答案就是把所有的数或起来. 如果n-k<m,那么因为k不超过100,ai不超过1e5,所以n不超过11 ...

  4. 【01】JSON基本信息

    [魔芋注] 就是一种格式,数据组合的格式.   JSON:JavaScript 对象表示法(JavaScript Object Notation).JSON 是存储和交换.传输(数据)文本信息的语法( ...

  5. LightOJ 1348 Aladdin and the Return Journey

    Aladdin and the Return Journey Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged ...

  6. Leetcode 80.删除重复数组的重复项

    删除重复数组的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...

  7. [luoguP1586] 四方定理(DP 背包)

    传送门 相当于背包, f[i][j] 表示当前数为 i,能分解成 j 个数的平方的和的数量 那么就是统计背包装物品的数量 ——代码 #include <cmath> #include &l ...

  8. HDU 3308 (线段树区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作  : 1 修改 单点  a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...

  9. Asm.Def谈笑风生

    ★   输入文件:asm_talk.in   输出文件:asm_talk.out简单对比时间限制:2 s   内存限制:256 MB [题目描述] “人呐都不知道,自己不可以预料,直升机刚一出圣地亚哥 ...

  10. C. Star sky 二维前缀和

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...