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

本文共 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

你可能感兴趣的文章
大家好,我是小组成员刘俊伟
查看>>
Daily Scrum: 2012/11/2
查看>>
订单页过滤,sql写法
查看>>
H3C:下一代互联网的安全起点
查看>>
【常用】source insight常用设置及快捷键
查看>>
AD走圆弧走线
查看>>
PHP获取Linux当前目录下文件并实现下载功能
查看>>
python-操作hive
查看>>
(Spring4 json入门)Spring4+SpringMVC+页面数据发送与接收(json格式)
查看>>
852. Peak Index in a Mountain Array
查看>>
Vijos P1114 FBI树【DFS模拟,二叉树入门】
查看>>
Web版简易五子棋
查看>>
set集合
查看>>
sersync实时同步
查看>>
修改Http消息的消息头Host
查看>>
获取ActionBar高度
查看>>
.NET面试题解析(06)-GC与内存管理
查看>>
[Android学习笔记]Context简单理解
查看>>
为确保固定资产的财务帐与实物帐一致,应采取的措施
查看>>
Codeforces Round #224 (Div. 2)
查看>>