洛谷 P1312 [ NOIP 2011 ] Mayan游戏 —— 搜索+模拟
题目: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游戏 —— 搜索+模拟的更多相关文章
- NOIp 2011 mayan游戏 搜索
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- [NOIp 2011]Mayan游戏
Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏 ...
- NOIP 2011 Mayan游戏 大暴搜
题目链接:https://www.luogu.org/problemnew/show/P1312 我的第一篇题解!! 当然感谢ZAGER 的提示,他的链接https://www.cnblogs.com ...
- Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝
写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...
- 【noip】跟着洛谷刷noip题2
noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- 洛谷 P3951 NOIP 2017 小凯的疑惑
洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...
- 洛谷P1312 Mayan游戏
P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
随机推荐
- Vue.js 观察者(watch)
Vue.js 观察者(watch) watch 属性用于监视 vue 实例上的数据变动,并相应的改变其他变量的值. 用法 实例 1 <!DOCTYPE html> <html> ...
- 数塔(hdoj 2084,动态规划递推)
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...
- 牛客练习赛25 C 再编号
解题思路 我们先来观察一下题目中给出的公式 $$a'_i=(\sum_{j=1}^na_j)-a_i$$ 通过这个公式推一下经过再编号后的序列的总和,因为我们推出这个和之后可以进行下一次计算. $$\ ...
- python 全栈之路
目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...
- 什么是js严格模式?
[03] 严格模式 ECMAScript 5 引入了严格模式(strict mode)的概念.严格模式是为JavaScript 定义了一种不同的解析与执行模型.在严格模式下,ECMAScript 3 ...
- [luoguP1516] 青蛙的约会(扩展欧几里得)
传送门 对于数论只会gcd的我,也要下定决心补数论了 列出方程 (x + t * m) % l = (y + t * n) % l 那么假设 这两个式子之间相差 num 个 l,即为 x + t * ...
- 开源的多行字符串工具: 在JS中整段地写HTML
这样看来ES6的多行字符模板可能就不需要了-- 通过这个你可以整段整段地在JS中写HTML.SQL了. 示例 之前你得这样写 var str = '' +'<!doctype html>' ...
- [51Nod1089] 最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称 ...
- [USACO 4.2] 完美的牛栏
★★☆ 输入文件:stall4.in 输出文件:stall4.out 简单对比 时间限制:1 s 内存限制:128 MB USACO/stall4(译by Felicia Crazy) ...
- Mzc家中的男家丁
题目背景 mzc与djn的…还没有众人皆知,所以我们要来宣传一下. 题目描述 mzc家很有钱(开玩笑),他家有n个男家丁,现在mzc要将她们全都聚集起来(干什么就不知道了).现在知道mzc与男家丁们互 ...