HDOJ3085 Nightmare II 双向BFS
重构一遍就A了。。。但这样效率太低了。。。莫非都要重构???QWQ
每一秒男同志bfs3层,女同志bfs1层。注意扩展状态时,要判一下合不合法再扩展,而不是只判扩展的状态合不合法,否则有可能由非法的走到合法的地方。
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define R register int
const int dx[]={-,,,},dy[]={,,,-};
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,t,tim,cc;
int gx,gy,mx,my,zx,zy,zx1,zy1;
char e[][];
inline int abs(int x) {return x>?x:-x;}
inline bool is(char ch) {return ch=='X'||ch=='Z'||ch=='M'||ch=='G'||ch=='.';}
inline bool ckpos(int x,int y) {
if(x<||x>n||y<||y>m||e[x][y]=='X') return false;
if(*tim>=abs(x-zx)+abs(y-zy)||*tim>=abs(x-zx1)+abs(y-zy1)) return false;
return true;
}
struct node{int x,y; node() {}
node(int xx,int yy) {x=xx,y=yy;}
};
queue<node>q,q1;
inline bool bfs() {
for(R x=;x<=;++x) { queue<node> qt=q; R sz=q.size();
while(sz--) {
node u=qt.front(); qt.pop(); R x=u.x,y=u.y;
if(!ckpos(x,y)) continue;
for(R i=;i<;++i) {
R xx=x+dx[i],yy=y+dy[i];
if(!ckpos(xx,yy)||e[xx][yy]=='M') continue;
if(e[xx][yy]=='G') return true; e[xx][yy]='M';
qt.push(node(xx,yy));
}
} q=qt;
} return false;
}
inline bool bfs1() { queue<node> qt=q1; R sz=q1.size();
while(sz--) {
node u=qt.front(); qt.pop(); R x=u.x,y=u.y;
if(!ckpos(x,y)) continue;
for(R i=;i<;++i) {
R xx=x+dx[i],yy=y+dy[i];
if(!ckpos(xx,yy)||e[xx][yy]=='G') continue;
if(e[xx][yy]=='M') return true; e[xx][yy]='G';
qt.push(node(xx,yy));
}
} q1=qt; return false;
}
signed main() {
t=g(); while(t--) { tim=; cc=;
n=g(),m=g();
for(R i=;i<=n;++i) for(R j=;j<=m;++j) {
while(!is(e[i][j]=getchar())); if(e[i][j]=='M') mx=i,my=j;
else if(e[i][j]=='G') gx=i,gy=j;
else if(e[i][j]=='Z') if(cc) zx1=i,zy1=j; else zx=i,zy=j,++cc;
} while(q.size()) q.pop(); while(q1.size()) q1.pop();
q.push(node(mx,my)); q1.push(node(gx,gy));
while(++tim) {
if(bfs()||bfs1()) {printf("%d\n",tim); break;}
if(q1.empty()||q.empty()) {printf("-1\n"); break;}
}
}
}
2019.04.27
HDOJ3085 Nightmare II 双向BFS的更多相关文章
- HDU 3085 Nightmare II 双向bfs 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...
- Nightmare Ⅱ(双向BFS)
Problem Description Last night, little erriyue had a horrible nightmare. He dreamed that he and his ...
- HDU 3085 Nightmare Ⅱ(双向BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...
- HDU 3085 Nightmare Ⅱ (双向BFS)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU3085 Nightmare Ⅱ —— 双向BFS + 曼哈顿距离
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Other ...
- HDU 3085 Nightmare Ⅱ 双向BFS
题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...
- HDU3085 Nightmare Ⅱ (双向BFS)
联赛前该练什么?DP,树型,状压当然是爆搜啦 双向BFS就是两个普通BFS通过一拼接函数联系,多多判断啦 #include <iostream> #include <cstdio&g ...
- Word Ladder(双向BFS)
2018-10-02 23:46:38 问题描述: 问题求解: 显然是个解空间遍历问题,每次修改其中一位,由于步长是1,所以可以使用BFS进行解空间的遍历.
- HDU3085(双向BFS+曼哈顿距离)题解
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- wangEditor富文本编辑器
设置好了是这样的, 有一个ID问content的编辑框,方便获取,这里的富文本编辑器的版本是2.2 官方文档说3就不支持textarea了 导入一下css 记得css文件夹下应该又3个文件,虽然没有直 ...
- hadoop搭建好,启动服务后,无法从web界面访问50070
在hadoop完全分布式搭建好以后,从主节点启动正常,使用jps查看启动的进程,正常,在几个从节点上使用jps查看,显示正常,但从web上输入下面网址: http://主节点IP:50070 无法正常 ...
- tensor 维度 问题。
tf.argmax takes two arguments: input and dimension. example: tf.argmx(arr, dimension = 1). or tf.arg ...
- [转]asp.net使用uploadify上传出现的IO Error问题
原文链接:http://blog.csdn.net/w3031213101/article/details/6335878 解决方法:1.uploadify控件的自定义size必须调整大小,即属性:s ...
- Tarjan算法求出强连通分量(包含若干个节点)
[功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...
- sqlServer通过指定的起始时间,创建该时间段内以年、月、日为时间段的临时表
通过指定的起始时间,创建该时间段内以年.月.日为时间段的临时表 ALTER PROCEDURE [dbo].[YOUR_SP_Name] -- Add the parameters for t ...
- docker入门及安装
Docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).ba ...
- WINDOWS权限大牛们,请进
大家好, 我遇到一个问题,我的一台windows7去访问另一个电脑的共享,输入账号密码后,老是说密码不正确.而其他电脑去访问共享,密码账号密码后都OK 我想知道原因是什么?
- [web] [vscode] 自定义语言缩进
vscode 默认的html 语言的缩进有点过,貌似一个tab6个space, html看起来太空了,所幸的是可以自己调整单个语言的缩进模式. 方法如下 Preferences: Open User ...
- win8 附件数据库失败解决方案《1》
sql server 2005附加数据库错误:尝试打开或创建物理文件 无法打开物理文件 "E:\works\database\northwnd\northwnd.mdf".操作系统 ...