Find a way

Time Limit: 3000/1000 MS (Java/Others)    Memory
Limit: 32768/32768 K (Java/Others)

Total Submission(s): 403    Accepted Submission(s): 129

Problem Description
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.

Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.

Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
 
Input
The input contains multiple test cases.

Each test case include, first two integers n, m. (2<=n,m<=200).

Next n lines, each line included m character.

‘Y’ express yifenfei initial position.

‘M’    express Merceki initial position.

‘#’ forbid road;

‘.’ Road.

‘@’ KCF
 
Output
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
 
Sample Input

4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
 
Sample Output
66
88
66

解题心得:

1、关于双向bfs的判定,一般是有两个移动的点,没有目标或者一个目标,当有三个或者更多的移动的点的时候一般要考虑是否可以用一些技巧消去一些。

2、双向bfs在找最小的路径之和的时候并不是找到了之后马上跳出,因为并不是第一个相遇的点一定是最短的点,所以在不超时,数据量比较小的时候尽量跑完,不然很可能在某个角落差生错误,找都找不到,在跑双向bfs 的时候标记一定要弄好,不然很目标是一个bfs跑了两次,这就很恼火了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
char maps[maxn][maxn];
int y_x,y_y,m_x,m_y;
int dir[4][2] ={0,1,0,-1,1,0,-1,0};
int n,m,Min,num_2;
bool use[2][maxn][maxn];//两个bfs,标记也要开两层
struct Vis
{
int num;//记录这个@点被找到了几次
bool is;
int sum;//用来记录两个bfs在@点相遇的时间的和
} vis[maxn][maxn];
struct node
{
int x,y;
};
queue<node>q[2],qt;//两个bfs的队列和层使用的队列 bool check(int x,int y)//检查一下可不可以走到那里
{
if(x<0 || y<0 || x>=n || y>=m)
return true;
if(maps[x][y] == '#')
return true;
return false;
}
void pre_maps()
{
//初始化很重要
Min = 0x7f7f7f7f;
memset(use,0,sizeof(use));
num_2 = 0;
while(!q[0].empty())
q[0].pop();
while(!q[1].empty())
q[1].pop();
while(!qt.empty())
qt.pop(); for(int i=0; i<n; i++)
scanf("%s",maps[i]);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
vis[i][j].is = false;
vis[i][j].num = 0;
vis[i][j].sum = 0;
if(maps[i][j] == 'Y')
{
y_x = i;
y_y = j;
use[0][y_x][y_y] = true;
}
if(maps[i][j] == 'M')
{
m_x = i;
m_y = j;
use[1][m_x][m_y] = true;
}
if(maps[i][j] == '@')//将@记录一下,在后面直接判断就行了
{
vis[i][j].is = true;
}
}
} bool bfs(int num,int ans)
{
node now,Next;
qt = q[num];
while(!qt.empty())
{
now = qt.front();
qt.pop();
q[num].pop();
for(int i=0; i<4; i++)
{
Next.x = now.x + dir[i][0];
Next.y = now.y + dir[i][1];
if(check(Next.x,Next.y)) continue;
if(vis[Next.x][Next.y].is && !use[num][Next.x][Next.y])
{
if(vis[Next.x][Next.y].num == 1)//被两个bfs找到,并且是两个不同的bfs,一定要做好标记啊,不然很恼火的,是两个不同的bfs
{
vis[Next.x][Next.y].sum += ans;//两次的时间和
Min = min(Min,vis[Next.x][Next.y].sum);//记录两个不同的bfs到达@的时间和的最小的那个
}
else if(vis[Next.x][Next.y].num == 0)//被一个bfs被找到
{
vis[Next.x][Next.y].sum += ans;
vis[Next.x][Next.y].num ++;
}
}
if(!use[num][Next.x][Next.y])
{
use[num][Next.x][Next.y] = true;
q[num].push(Next);
}
}
}
}
int get_ans()
{
int ans = 0;
node now;
now.x = y_x;
now.y = y_y;
q[0].push(now);
now.x = m_x;
now.y = m_y;
q[1].push(now); bool flag1 = false;
bool flag2 = false;
while(!q[0].empty() || !q[1].empty())//两个bfs一层一层的跑
{
ans += 11;//每走一步花11分钟
bfs(0,ans);
bfs(1,ans);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
pre_maps();
get_ans();
printf("%d\n",Min);
}
return 0;
}

BFS:HDU2612-Find a way(双向BFS)的更多相关文章

  1. UVA1601-The Morning after Halloween(双向BFS)

    Problem UVA1601-The Morning after Halloween Accept: 289 Submit: 3136 Time Limit: 12000 mSec  Problem ...

  2. HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

    题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...

  3. 洛谷 P1379 八数码难题(map && 双向bfs)

    题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...

  4. POJ1915Knight Moves(单向BFS + 双向BFS)

    题目链接 单向bfs就是水题 #include <iostream> #include <cstring> #include <cstdio> #include & ...

  5. HDU 3085 Nightmare II 双向bfs 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...

  6. POJ 3170 Knights of Ni (暴力,双向BFS)

    题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...

  7. [转] 搜索之双向BFS

    转自:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx 如果目标也已知的话,用双向BFS能很大程度上提高速度. 单向时,是 b^le ...

  8. 双向BFS

    转自“Yuan” 如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个 ...

  9. HDU 3085 Nightmare Ⅱ (双向BFS)

    Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. HDU 3085 Nightmare Ⅱ 双向BFS

    题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...

随机推荐

  1. com.google.gson.stream.MalformedJsonException的解决办法

    关于Gson解析的异常,如果你程序出现以下的异常,有两种可能性:‘ 1. 找到一个JSON格式的验证工具,这个网上很多大家可以百度下: 2.你的JSON格式验证没有问题,却一直报这个解析错误,请确定你 ...

  2. CentOS7.4搭建GitLab

    1.查看服务器环境 uname -a 2.下载安装包 [1]找到相应的最新版本的下载路径 网址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/e ...

  3. SpringMVC核心技术---转发和重定向

    @Controller public class Mycontroller { //转发 @RequestMapping("/adduser") public String add ...

  4. OAuth相关知识

    什么是OAuth认证 1.一种安全认证的协议;2.协议为用户资源的授权提供了一个安全的.开放又简易的标准;3.OAuth的授权不会使第三方触及到用户的账户信息(例如用户名和密码) 网址:www.oau ...

  5. JFrame 文本打印

    package tools; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import jav ...

  6. 第6章 传输层(详解TCP的三次握手与四次挥手)

    第6章 传输层 传输层简介 传输层为网络应用程序提供了一个接口,并且能够对网络传输提供了可选的错误检测.流量控制和验证功能.TCP/IP传输层包含很多有用的协议,能够提供数据在网络传输所需的必要寻址信 ...

  7. String对象中常用的方法有哪些?

    1.length()字符串长度 String str="abc"; System.out.println(str.length()); //输出3 2.charAt()截取一个字符 ...

  8. Spring Boot : Swagger 2

    每次修改完代码需要找原本的API时楼主的内心是痛苦的,因为一般情况下都找不到,需要重新写一份.如果使用Swagger的话,只要加几个注解就可以实时生成最新的在线API文档,而且不仅仅是文档,同时支持A ...

  9. svn项目权限控制

    [groups] g_manager = zhangsan g_php = lisi g_test = wangwu [/] @g_manager = rw [project:/] @g_manage ...

  10. LeetCode Reverse Bits 反置位值

    题意:给定一个无符号32位整数,将其二进制形式左右反置,再以整型返回. 思路:循环32轮,将n往右挤出一位就补到ans的尾巴上. class Solution { public: uint32_t r ...