洛谷 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 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
随机推荐
- HDU多校Round 7
Solved:2 rank:293 J. Sequense 不知道自己写的什么东西 以后整数分块直接用 n / (n / i)表示一个块内相同n / i的最大i #include <bits/s ...
- 阿里云ECS屏蔽25端口,官方建议使用465 SSL端口发送邮件
阿里云ECS VPC网络,搭建了zabbix,想通过三方邮件系统发送邮件,本机开虚拟机测试发邮件一切正常,到阿里ECS的时候邮件各种发不出去,到处找原因,最后度娘告诉了我真想,原来阿里把25端口屏蔽 ...
- SERE0014: Illegal HTML character: decimal 154
问题:jmeter,生成报告转化成html,报错SERE0014: Illegal HTML character: decimal 154 原因: 某些字符,特别是控制字符#x7F-#x9F ,在XM ...
- BZOJ 4094 USACO 2013 Dec. Optimal Milking
线段树 每个节点保存4个值,both表示左右端点都取,neither表示左右端点都不取,left表示只取左端点,right表示只取右端点. 维护的特殊姿势: $cur$的$both=max(ls.l+ ...
- JUnit基本用法
JUnit的一些注意事项: 测试方法必须使用@Test修饰 测试方法必须使用public void进行修饰,不能带参数 一般使用单元测试会新建一个test目录存放测试代码,在生产部署的时候只需要将te ...
- SpringBoot yaml的配置及使用
application.yml配置如下 person: lastName: hello age: boss: false birth: // maps: {k ...
- 【03】WAMPServer集成环境下载和安装
WAMPServer集成环境下载和安装1.W:windows,A:Apache,M:MySQL,P:PHP2.下载WAMP开发包网址:www.wampserver.com 3.安装 ...
- Java Web学习总结(29)——Java Web中的Filter和Interceptor比较
1. 背景 在设计web应用的时候,用户登录/注册是必不可少的功能,对用户登录信息进行验证的方法也是多种多样,大致可以认为如下模式:前端验证+后台验证.根据笔者的经验,一般会在前端进行一些例如是否输入 ...
- 互斥的数(codevs 1553)
题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知 ...
- 【GC分析】Java GC日志查看
Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃圾收集. UsePa ...