HDU 2612 find a way 【双BFS】
<题目链接>
题目大意:
两个人分别从地图中的Y 和 M出发,要共同在 @ 处会面(@不止有一处),问这两个人所走距离和的最小值是多少。
解题分析:
就是对这两个点分别进行一次BFS,求出它们到每一个 @ 点的最短距离,然后距离和最小的即为所求(图上一步相当于 11)。此题有坑,必须判断两个人是否都能够走到那个@点,如果不能走到,那么那个距离和应该作废。
#include<iostream>
#include<queue>
#include<algorithm>
#include<memory.h>
#include<utility>
using namespace std;
typedef pair<int,int> P;
const int MAX=;
int dir[][]={,,,,-,,,-};
char maze[MAX][MAX];
int visa[MAX][MAX],visb[MAX][MAX];
int n,m;
void bfs(int x,int y,int vis[][MAX])
{
queue<P>q;
q.push(P(x,y));
while(!q.empty())
{
P p=q.front();
q.pop();
for(int i=;i<;i++) {
int nx=p.first+dir[i][],ny=p.second+dir[i][];
if(nx>=&&ny>=&&nx<n&&ny<m&&maze[nx][ny]!='#'&&vis[nx][ny]==) {
vis[nx][ny]=vis[p.first][p.second]+;
q.push(P(nx,ny));
}
}
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
int a,b,c,d;
memset(visa,,sizeof(visa));
memset(visb,,sizeof(visb));
for(int i=;i<n;i++){
scanf("%s",&maze[i]);
for(int j=;j<m;j++) {
if(maze[i][j]=='Y') {
a=i,b=j;
}
if(maze[i][j]=='M') {
c=i,d=j;
}
}
}
bfs(a,b,visa);
bfs(c,d,visb);
int mini=0x3f3f3f3f;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(maze[i][j]=='@'&&visa[i][j]+visb[i][j]!=) //未到达的KFC
mini=min(mini,visa[i][j]+visb[i][j]);
cout<<mini<<endl;
}
return ;
}
这是我的代码,WA了,但是不知道为什么,先记录下来。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std; const int maxn=+;
#define INF 0x3f3f3f3f int n,m;
char mpa[maxn][maxn];
int vis[maxn][maxn];
int dis[maxn];
int arrive[maxn]; int dir[][]={,,,,-,,,-}; struct NODE{
int x,y;
NODE(int a=,int b=){
x=a,y=b;
}
};
vector<NODE>v; struct node{
int x,y;
int step;
node(int a=,int b=,int c=):x(a),y(b),step(c){}
}; void bfs(node ital){
memset(vis,,sizeof(vis));
queue<node>q;
q.push(ital);
vis[ital.x][ital.y]=;
while(!q.empty()){
node now=q.front();
q.pop();
if(mpa[now.x][now.y]=='@'){
for(int i=;i<v.size();i++){
if(v[i].x==now.x&&v[i].y==now.y){
dis[i]+=now.step;
arrive[i]++;
}
}
}
for(int k=;k<;k++){
int xx=now.x+dir[k][];
int yy=now.y+dir[k][];
if(xx<||xx>n||yy<||yy>m||vis[xx][yy]||mpa[xx][yy]=='#')continue;
if(mpa[xx][yy]=='Y'||mpa[xx][yy]=='M')continue;
vis[xx][yy]=;
q.push(node(xx,yy,now.step+));
}
}
} int main(){
while(scanf("%d %d",&n,&m)!=EOF){
v.clear();
for(int i=;i<=n;i++){
scanf("%s",mpa[i]+);
for(int j=;j<=m;j++){
if(mpa[i][j]=='@'){
v.push_back(NODE(i,j)); //将全部 @单独地存到vector中,这样会给每一个@编号,方便查询
}
}
}
memset(arrive,,sizeof(arrive));
memset(dis,,sizeof(dis));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mpa[i][j]=='Y'||mpa[i][j]=='M'){
bfs(node(i,j,));
}
}
}
int mx=INF;
for(int i=;i<v.size();i++){
if(arrive[i]!=)dis[i]=INF; //如果这个KFC不是两个人都能到达,那么求出来的dis无效,所以将其设为INF
mx=min(mx,dis[i]);
}
printf("%d\n",mx*);
}
return ;
}
2018-08-29
HDU 2612 find a way 【双BFS】的更多相关文章
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
- HDU - 2612 Find a way 双起点bfs(路径可重叠:两个队列分别跑)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU - 2612 Find a way 【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2612 题意 有两个人 要去一个城市中的KFC 一个城市中有多个KFC 求两个人到哪一个KFC的总时间最 ...
- hdu 2612 Find a way(BFS)
题目链接:hdu2612 思路:题意是求两个人到某一个KFC花费时间和最小,其实就是求最短距离和,用两个BFS,分别以两个人为起点,分别记录下两人到每个KFC的距离,然后求出最小的和 #include ...
- (简单) HDU 2612 Find a way,BFS。
Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...
- HDU - 2612 Find a way(BFS搜索)
题目: 链接 思路: 用BFS分别以‘Y’和‘M’的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到‘@’更行最小值. PS: 如果用‘Y’和‘M’点分别去搜每个 ...
- BFS(最短路) HDU 2612 Find a way
题目传送门 /* BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值 */ /***************************************** ...
- 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 ...
- HDU 2612 Find a way(找条路)
HDU 2612 Find a way(找条路) 00 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
随机推荐
- undefined reference问题总结
http://ticktick.blog.51cto.com/823160/431329 http://blog.sina.com.cn/s/blog_605f5b4f01018xeu.html ht ...
- C++ socket 传输不同类型数据的四种方式
使用socket传输组织好的不同类型数据,有四种不同的方式(我知道的嘿嘿): a. 结构体 b. Json序列化 c. 类对象 d. protobuf 下面逐一整理一下,方便以后进行项目开发. 1. ...
- 【工具测试】Acunetix 11-登录后扫描的功能
1.概要 在测试的过程中,会给一些只有登录口的测试站点,只有登录后才能访问更多的页面. Acunetix 11的登录后扫描功能摸索了老半天,原来这么神奇.学习了! 2.操作 登录之后 - [Add T ...
- jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法
一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. 在本文中我们将学习这些新特性,并用实际 ...
- mysql系列七、mysql索引优化、搜索引擎选择
一.建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天 ...
- Linux版本Membase无法写入default bucket的问题分析
最近项目中使用的membase发现出了点问题,生产环境中读写各种数据都正常,可是新搭建的开发环境下,只有default bucket写不进去数据,调用store总是返回FALSE,配置文件也是一模一样 ...
- centos6.5环境利用scp实现自动化文件备份
centos6.5环境利用scp自动上传备份文件到指定服务器中 需要备份的主机 192.168.3.17 存放备份的主机 192.168.3.18 目的:将3.17主机上/data/storage的文 ...
- Android数据存储:SQLite
Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...
- vue 安装教程(自己安装过程及遇到的一些坑)
1.安装node.js(http://www.runoob.com/nodejs/nodejs-install-setup.html) 2.基于node.js,利用淘宝npm镜像安装相关依赖 在cmd ...
- 测试开发之前端——No9.HTML5中的视频/音频
HTML5 视频和音频的 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> 元素提供了方法.属性和事件. 这些方法.属性和事件允许您使用 JavaS ...