题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

思路:从两个起点出发,有多个终点,求从两个起点同时能到达的终点具有的最小时间,开两个数组分别保存两个起点到达每一个终点的用时,最后将两个

数组里的时间加起来求最小的一组,必须对应相加,因为终点必须同时到达。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
struct node{
int x,y,step;
}a[1010];
node p,q;
int n,m,sx1,sy1,sx2,sy2,ans1[1010],ans2[1010],ans[1010];
int mmin,cnt;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char maze[205][205];
bool visit[205][205];
int judge(int x,int y){
for(int i=1;i<cnt;i++)
{
if(x==a[i].x&&y==a[i].y)return i;
}
return 0;
}
void bfs1(int x,int y){
memset(ans,0,sizeof(ans));
memset(ans1,-1,sizeof(ans1));
memset(visit,0,sizeof(visit));
queue<node> Q;
p.x=x;
p.y=y;
p.step=0;
Q.push(p);
visit[p.x][p.y]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
int num=judge(p.x,p.y);
if(num){
ans[num]=p.step;
visit[p.x][p.y]=1;
}
for(int i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
q.step=p.step+1;
if(q.x<0||q.x>=n||q.y<0||q.y>=m)continue;
if(visit[q.x][q.y])continue;
if(maze[q.x][q.y]=='#')continue;
Q.push(q);
visit[q.x][q.y]=1;
}
}
for(int i=1;i<cnt;i++){
if(ans[i])ans1[i]=ans[i];
} }
void bfs2(int x,int y){
memset(ans,0,sizeof(ans));
memset(ans2,-1,sizeof(ans2));
memset(visit,0,sizeof(visit));
queue<node> Q;
p.x=x;
p.y=y;
p.step=0;
Q.push(p);
visit[p.x][p.y]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
int num=judge(p.x,p.y);
if(num){
ans[num]=p.step;
visit[p.x][p.y]=1;
}
for(int i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
q.step=p.step+1;
if(q.x<0||q.x>=n||q.y<0||q.y>=m)continue;
if(visit[q.x][q.y])continue;
if(maze[q.x][q.y]=='#')continue;
Q.push(q);
visit[q.x][q.y]=1;
}
}
for(int i=1;i<cnt;i++){
if(ans[i])ans2[i]=ans[i];
}
}
int main()
{
//ifstream fin;
//fin.open("data1.txt"); while(cin>>n>>m)
{
cnt=1;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
cin>>maze[i][j];
if(maze[i][j]=='Y'){
sx1=i;
sy1=j;
}
if(maze[i][j]=='M'){
sx2=i;
sy2=j;
}
if(maze[i][j]=='@'){
a[cnt].x=i;
a[cnt++].y=j;
}
}
mmin=999999;
bfs1(sx1,sy1);
bfs2(sx2,sy2);
for(int i=1;i<cnt;i++)
{
if(ans1[i]!=-1&&ans2[i]!=-1){
int tsum=ans1[i]+ans2[i];
if(mmin>tsum)mmin=tsum;
}
}
cout<<mmin*11<<endl;
}
return 0; }

HDU/HDOJ 2612 Find a way 双向BFS的更多相关文章

  1. Eight (HDU - 1043|POJ - 1077)(A* | 双向bfs+康拓展开)

    The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...

  2. hdoj 2612 Find a way【bfs+队列】

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 2612 Find a way(双向bfs)

    题目代号:HDU 2612 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 Find a way Time Limit: 3000/1000 M ...

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

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

  5. 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...

  6. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  7. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

  8. HDU 3085 Nightmare Ⅱ(双向BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...

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

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

随机推荐

  1. YT工作日志-0911

    上午 在导师的帮助下,帮我从svn上下载了项目.但是因为项目太大(不算jar包有730M),很多模块不是我工作中涉及的,但是运行的时候会报错,所以导师还帮我找了很多错误.把那些不需要的东西注释了.就这 ...

  2. Unity 3D 建立开发环境

    之后的基本方向 ios游戏开发,基础教程http://www.devdiv.com/unity_d_-thread-128068-1-1.html,学习Unity 3D游戏开发. 应该昨天表示,读了一 ...

  3. 项目优化经验分享(六)SVN冲突和处理

    上一篇博客我们分享了新增需求的确定思想<站在全局看问题>.今天我们来分享项目开发中SVN冲突的解决经验:SVN冲突和处理! 引言 开发过项目的人都知道,公司开发一个项目都会使用到版本号控制 ...

  4. fcntl()

      fcntl() F_GETFL---------------------------------------------        将文件状态标志作为函数值返回. 文件状态标志:        ...

  5. AspNetCore.Hosting

    Microsoft.AspNetCore.Hosting 有关Hosting的基础知识 Hosting是一个非常重要,但又很难翻译成中文的概念.翻译成:寄宿,大概能勉强地传达它的意思.我们知道,有一些 ...

  6. WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制

    原文:WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制 和传统的分布式远程调用一样,WCF的服务调用借助于服务代理(Service ...

  7. windows/linuxjdk安装,jdk1.6升级到1.7

    一.JDK: JAVA_HOME: C:\Program Files\Java\jdk1.7.0_79 PATH: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASS ...

  8. QUrl不同版本之间的坑

    在项目中使用了native application + html的方式构建界面. 之前在4.8.4用QUrl直接加载相对路径一点问题都没有.但是切换到5.1编译之后却发现本地的html文件全部没有加载 ...

  9. HDU 5046 Airport(DLX反复覆盖)

    HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...

  10. ASP.NET - 网页重定向 Response.Redirect()

    在网页中使用重定向,意思就是在网站中的某一个页面跳转到另一个页面. Response.Redirect(~/abc.aspx); 使用“~”的作用是可以从任意位置跳转. 如果没有“~”,那么跳转的时候 ...