BFS(最短路) HDU 2612 Find a way

题目传送门

  1 /*
  2     BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值
  3 */
  4 /************************************************
  5 Author        :Running_Time
  6 Created Time  :2015-8-4 19:36:36
  7 File Name     :HDOJ_2612.cpp
  8 ************************************************/
  9
 10 #include <cstdio>
 11 #include <algorithm>
 12 #include <iostream>
 13 #include <sstream>
 14 #include <cstring>
 15 #include <cmath>
 16 #include <string>
 17 #include <vector>
 18 #include <queue>
 19 #include <deque>
 20 #include <stack>
 21 #include <list>
 22 #include <map>
 23 #include <set>
 24 #include <bitset>
 25 #include <cstdlib>
 26 #include <ctime>
 27 using namespace std;
 28
 29 #define lson l, mid, rt << 1
 30 #define rson mid + 1, r, rt << 1 | 1
 31 typedef long long ll;
 32 const int MAXN = 2e2 + 10;
 33 const int INF = 0x3f3f3f3f;
 34 const int MOD = 1e9 + 7;
 35 char maze[MAXN][MAXN];
 36 bool vis[MAXN][MAXN];
 37 int step[MAXN][MAXN];
 38 int step2[MAXN][MAXN];
 39 int dx[4] = {-1, 1, 0, 0};
 40 int dy[4] = {0, 0, -1, 1};
 41 int n, m;
 42 int sx, sy, ex, ey;
 43
 44 bool judge_y(int x, int y)  {
 45     if (x < 1 || x > n || y < 1 || y > m || maze[x][y] == ‘#‘ || vis[x][y]) return false;
 46     return true;
 47 }
 48
 49 bool judge_m(int x, int y)  {
 50     if (x < 1 || x > n || y < 1 || y > m || maze[x][y] == ‘#‘ || vis[x][y])  return false;
 51     return true;
 52 }
 53
 54 void BFS_Y(void)    {
 55     memset (step, 0, sizeof (step));
 56     memset (vis, false, sizeof (vis));
 57     queue<pair<int, int> > Q;   Q.push (make_pair (sx, sy));
 58     vis[sx][sy] = true; step[sx][sy] = 0;
 59     while (!Q.empty ()) {
 60         int x = Q.front ().first, y = Q.front ().second;    Q.pop ();
 61         for (int i=0; i<4; ++i) {
 62             int tx = x + dx[i], ty = y + dy[i];
 63             if (!judge_y (tx, ty))   continue;
 64             Q.push (make_pair (tx, ty));    vis[tx][ty] = true;
 65             step[tx][ty] = step[x][y] + 1;
 66         }
 67     }
 68 }
 69
 70 void BFS_M(void)    {
 71     memset (vis, false, sizeof (vis));
 72     memset (step2, 0, sizeof (step2));
 73     queue<pair<int, int> > Q;   Q.push (make_pair (ex, ey));
 74     vis[ex][ey] = true; step2[ex][ey] = 0;
 75     while (!Q.empty ()) {
 76         int x = Q.front ().first, y = Q.front ().second;    Q.pop ();
 77         for (int i=0; i<4; ++i) {
 78             int tx = x + dx[i], ty = y + dy[i];
 79             if (!judge_m (tx, ty))  continue;
 80             step2[tx][ty] = step2[x][y] + 1;
 81             Q.push (make_pair (tx, ty));    vis[tx][ty] = true;
 82         }
 83     }
 84 }
 85
 86 int main(void)    {     //HDU 2612 Find a way
 87     while (scanf ("%d%d", &n, &m) == 2) {
 88         for (int i=1; i<=n; ++i)    {
 89             scanf ("%s", maze[i] + 1);
 90             for (int j=1; j<=m; ++j)    {
 91                 if (maze[i][j] == ‘Y‘)  sx = i, sy = j;
 92                 if (maze[i][j] == ‘M‘)  ex = i, ey = j;
 93             }
 94         }
 95         BFS_Y ();   BFS_M ();
 96         int ans = INF;
 97         for (int i=1; i<=n; ++i)    {
 98             for (int j=1; j<=m; ++j)    {
 99                 if (maze[i][j] == ‘@‘ && vis[i][j])  {
100                     ans = min (ans, step[i][j] + step2[i][j]);
101                 }
102             }
103         }
104         if (ans == INF) puts ("-1");
105         else    printf ("%d\n", ans * 11);
106     }
107
108     return 0;
109 }
时间: 2024-10-29 01:14:38

BFS(最短路) HDU 2612 Find a way的相关文章

Problem N HDU 2612 Find a way (两次BFS求最值)

N - Find a way Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2612 Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei hav

HDU 2612 -Find a way (注意细节的BFS)

题目链接:Find a Way 题目不难,前几天做,当时准备写双向BFS的,后来处理细节上出了点问题,赶上点事搁置了,今天晚上重写的,没用双向,用了两次BFS搜索,和双向BFS 道理差不多,只是这题有个小坑,需要注意 1.Y不能经过M,M不能经过Y,也就是说有Y和M的格子,可以默认为是墙 2.必须是Y和M都能到达的KFC才行,只是其中一个到达不行 例如下列数据:答案既不是22 也不是 88 而是110,左下角的KFC满座条件 5 5 Y..#@ ...M. ....# ..... @.... 小

BZOJ 1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 BFS+最短路

题意:链接 **方法:**BFS+最短路 解析: 这道题还是挺有意思的. 第一个想法被卡,第一发是二分+bfs,但是这样的话,会有什么处理不了呢?到一个点的流量. 所以就得换想法. 不妨重新定义最短路. 把图中所有的0的点看做可行点,每一次搜出从该点可以到打的0点,然后将这个边权视作1. 即f[i][j]代表到i,j这点的最短路. 显然终点特判: 然后同时记录一下最短路的数量即可. 代码: #include <queue> #include <cstdio> #include &l

uva11624 fire bfs 最短路

// uva11624 bfs最短路 // Fire 给你一个图,有一个起点'J',从任何边界走出去就算成功 // 但是,会有起火的地方,每秒火会上下左右四个方向蔓延,人不能 // 走有火的地方,问能不能逃出去,逃出去的最少步数是多少 // // 我的思路就是先预处理出每个地方的火的燃烧的最开始的时间 // 这bfs就可以了,计为f[i][j]; // 之后的再走一遍最短路,用s[i][j]记录人所能达到的最早的时间 // 走不到为-1,则,最后只要判断边界上能走到的就ok了 // 优化就是当走

题解——逃离僵尸岛(BFS+最短路+虚拟节点)

题解--逃离僵尸岛(BFS+最短路+虚拟节点) 一道很巧妙的最短路问题,细节也要注意 题面 Description 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入.由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市.换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险. 小a住在1号城市,国际

HDU 2612 Find a way bfs 难度:1

http://acm.hdu.edu.cn/showproblem.php?pid=2612 bfs两次就可将两个人到达所有kfc的时间求出,取两人时间之和最短的即可,这个有点不符合实情,题目应该出两人最大时间最小才对 #include <cstdio> #include <cstring> #include <queue> using namespace std; const int inf=0x3fffffff; char maz[300][301]; int n,

HDU 2612 Find a way(BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 题目大意:给你一张n*m的图,图上有两个点Y.M,和若干个点@,找出某个点@使Y.M到这里的距离之和最小,并求出距离. 解题思路:BFS,求出Y.M到各个@的最小距离存下来,最后枚举各个@找出最小距离和即可. 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algor

HDU 2612 (BFS搜索+多终点)

题目链接: http://poj.org/problem?id=1947 题目大意:两人选择图中一个kfc约会.问两人到达时间之和的最小值. 解题思路: 对于一个KFC,两人的BFS目标必须一致. 于是就有以下的SB行为:记录所有KFC,对于每个KFC,对两人BFS.然后你就会看见红红的TLE. 实际上,只需要两次BFS就可以了,用time_k[0][i]记录a同学到达第i个kfc的时间,time_k[1][i]记录b同学到达第i个kfc的时间. 在一次bfs过程中,记录到达所有kfc的时间.

hdu 3681 Prison Break (状态压缩+bfs+最短路)

Prison Break Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3214    Accepted Submission(s): 829 Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But on