博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BFS(双向) HDOJ 3085 Nightmare Ⅱ
阅读量:4973 次
发布时间:2019-06-12

本文共 2175 字,大约阅读时间需要 7 分钟。

 

题意:一个人去救女朋友,两个人都在运动,还有鬼在"扩散",问最少几秒救到女朋友

分析:开两个队列来表示两个人走过的路,一个人走到的地方另一个人已经vis了,那么就是相遇了,鬼就用曼哈顿距离判断.

 

#include 
using namespace std;const int N = 8e2 + 5;char maze[N][N];int n, m;bool vis[N][N][2];int dx[4] = {-1, 1, 0, 0};int dy[4] = {0, 0, -1, 1};struct Point { int x, y; Point() {} Point(int x, int y) : x (x), y (y) {}};queue
que[2];Point mm, gg, gho[2];int get_dis(int x, int y, int ex, int ey) { return abs (ex - x) + abs (ey - y);}bool check2(int x, int y, int tim) { for (int i=0; i<2; ++i) { if (get_dis (x, y, gho[i].x, gho[i].y) <= 2 * tim) return false; } return true;}bool check(int x, int y, int typ) { if (x < 1 || x > n || y < 1 || y > m || maze[x][y] == 'X') return false; else return true;}void init(void) { while (!que[0].empty ()) que[0].pop (); while (!que[1].empty ()) que[1].pop (); memset (vis, false, sizeof (vis));}bool BFS(int typ, int tim) { int sz = que[typ].size (); while (sz--) { Point u = que[typ].front (); que[typ].pop (); if (!check (u.x, u.y, typ) || !check2 (u.x, u.y, tim)) continue; for (int i=0; i<4; ++i) { int tx = u.x + dx[i], ty = u.y + dy[i]; if (!check (tx, ty, typ) || !check2 (tx, ty, tim)) continue; if (vis[tx][ty][typ^1]) return true; if (vis[tx][ty][typ]) continue; vis[tx][ty][typ] = true; que[typ].push (Point (tx, ty)); } } return false;}int run(void) { init (); vis[mm.x][mm.y][0] = true; vis[gg.x][gg.y][1] = true; que[0].push (Point (mm.x, mm.y)); que[1].push (Point (gg.x, gg.y)); int step = 0; while (!que[0].empty () || !que[1].empty ()) { ++step; for (int i=0; i<3; ++i) { if (BFS (0, step)) return step; } if (BFS (1, step)) return step; } return -1;}int main(void) { int T; scanf ("%d", &T); while (T--) { scanf ("%d%d", &n, &m); for (int i=1; i<=n; ++i) { scanf ("%s", maze[i] + 1); } int t = 0; for (int i=1; i<=n; ++i) { for (int j=1; j<=m; ++j) { if (maze[i][j] == 'M') { mm.x = i; mm.y = j; } else if (maze[i][j] == 'G') { gg.x = i; gg.y = j; } else if (maze[i][j] == 'Z') { gho[t].x = i; gho[t++].y = j; } } } printf ("%d\n", run ()); } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/4992973.html

你可能感兴趣的文章
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
20120227_CET6
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>
编写高质量代码--改善python程序的建议(六)
查看>>
windows xp 中的administrator帐户不在用户登录内怎么解决?
查看>>
接口和抽象类有什么区别
查看>>
Codeforces Round #206 (Div. 2)
查看>>
**p
查看>>
优先队列详解
查看>>
VS2012 创建项目失败,,提示为找到约束。。。。
查看>>
设计类图
查看>>