<题目链接>

题目大意:
两个人分别从地图中的Y 和 M出发,要共同在 @ 处会面(@不止有一处),问这两个人所走距离和的最小值是多少。

解题分析:

就是对这两个点分别进行一次BFS,求出它们到每一个 @ 点的最短距离,然后距离和最小的即为所求(图上一步相当于 11)。此题有坑,必须判断两个人是否都能够走到那个@点,如果不能走到,那么那个距离和应该作废。

  1. #include<iostream>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<memory.h>
  5. #include<utility>
  6. using namespace std;
  7. typedef pair<int,int> P;
  8. const int MAX=;
  9. int dir[][]={,,,,-,,,-};
  10. char maze[MAX][MAX];
  11. int visa[MAX][MAX],visb[MAX][MAX];
  12. int n,m;
  13. void bfs(int x,int y,int vis[][MAX])
  14. {
  15. queue<P>q;
  16. q.push(P(x,y));
  17. while(!q.empty())
  18. {
  19. P p=q.front();
  20. q.pop();
  21. for(int i=;i<;i++) {
  22. int nx=p.first+dir[i][],ny=p.second+dir[i][];
  23. if(nx>=&&ny>=&&nx<n&&ny<m&&maze[nx][ny]!='#'&&vis[nx][ny]==) {
  24. vis[nx][ny]=vis[p.first][p.second]+;
  25. q.push(P(nx,ny));
  26. }
  27. }
  28. }
  29. }
  30.  
  31. int main()
  32. {
  33. while(~scanf("%d%d",&n,&m))
  34. {
  35. int a,b,c,d;
  36. memset(visa,,sizeof(visa));
  37. memset(visb,,sizeof(visb));
  38. for(int i=;i<n;i++){
  39. scanf("%s",&maze[i]);
  40. for(int j=;j<m;j++) {
  41. if(maze[i][j]=='Y') {
  42. a=i,b=j;
  43. }
  44. if(maze[i][j]=='M') {
  45. c=i,d=j;
  46. }
  47. }
  48. }
  49. bfs(a,b,visa);
  50. bfs(c,d,visb);
  51. int mini=0x3f3f3f3f;
  52. for(int i=;i<n;i++)
  53. for(int j=;j<m;j++)
  54. if(maze[i][j]=='@'&&visa[i][j]+visb[i][j]!=) //未到达的KFC
  55. mini=min(mini,visa[i][j]+visb[i][j]);
  56. cout<<mini<<endl;
  57. }
  58. return ;
  59. }

这是我的代码,WA了,但是不知道为什么,先记录下来。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <queue>
  7. using namespace std;
  8.  
  9. const int maxn=+;
  10. #define INF 0x3f3f3f3f
  11.  
  12. int n,m;
  13. char mpa[maxn][maxn];
  14. int vis[maxn][maxn];
  15. int dis[maxn];
  16. int arrive[maxn];
  17.  
  18. int dir[][]={,,,,-,,,-};
  19.  
  20. struct NODE{
  21. int x,y;
  22. NODE(int a=,int b=){
  23. x=a,y=b;
  24. }
  25. };
  26. vector<NODE>v;
  27.  
  28. struct node{
  29. int x,y;
  30. int step;
  31. node(int a=,int b=,int c=):x(a),y(b),step(c){}
  32. };
  33.  
  34. void bfs(node ital){
  35. memset(vis,,sizeof(vis));
  36. queue<node>q;
  37. q.push(ital);
  38. vis[ital.x][ital.y]=;
  39. while(!q.empty()){
  40. node now=q.front();
  41. q.pop();
  42. if(mpa[now.x][now.y]=='@'){
  43. for(int i=;i<v.size();i++){
  44. if(v[i].x==now.x&&v[i].y==now.y){
  45. dis[i]+=now.step;
  46. arrive[i]++;
  47. }
  48. }
  49. }
  50. for(int k=;k<;k++){
  51. int xx=now.x+dir[k][];
  52. int yy=now.y+dir[k][];
  53. if(xx<||xx>n||yy<||yy>m||vis[xx][yy]||mpa[xx][yy]=='#')continue;
  54. if(mpa[xx][yy]=='Y'||mpa[xx][yy]=='M')continue;
  55. vis[xx][yy]=;
  56. q.push(node(xx,yy,now.step+));
  57. }
  58. }
  59. }
  60.  
  61. int main(){
  62. while(scanf("%d %d",&n,&m)!=EOF){
  63. v.clear();
  64. for(int i=;i<=n;i++){
  65. scanf("%s",mpa[i]+);
  66. for(int j=;j<=m;j++){
  67. if(mpa[i][j]=='@'){
  68. v.push_back(NODE(i,j)); //将全部 @单独地存到vector中,这样会给每一个@编号,方便查询
  69. }
  70. }
  71. }
  72. memset(arrive,,sizeof(arrive));
  73. memset(dis,,sizeof(dis));
  74. for(int i=;i<=n;i++){
  75. for(int j=;j<=m;j++){
  76. if(mpa[i][j]=='Y'||mpa[i][j]=='M'){
  77. bfs(node(i,j,));
  78. }
  79. }
  80. }
  81. int mx=INF;
  82. for(int i=;i<v.size();i++){
  83. if(arrive[i]!=)dis[i]=INF; //如果这个KFC不是两个人都能到达,那么求出来的dis无效,所以将其设为INF
  84. mx=min(mx,dis[i]);
  85. }
  86. printf("%d\n",mx*);
  87. }
  88. return ;
  89. }

2018-08-29

HDU 2612 find a way 【双BFS】的更多相关文章

  1. HDU.2612 Find a way (BFS)

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

  2. HDU - 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】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2612 题意 有两个人 要去一个城市中的KFC 一个城市中有多个KFC 求两个人到哪一个KFC的总时间最 ...

  4. hdu 2612 Find a way(BFS)

    题目链接:hdu2612 思路:题意是求两个人到某一个KFC花费时间和最小,其实就是求最短距离和,用两个BFS,分别以两个人为起点,分别记录下两人到每个KFC的距离,然后求出最小的和 #include ...

  5. (简单) HDU 2612 Find a way,BFS。

    Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...

  6. HDU - 2612 Find a way(BFS搜索)

    题目: 链接 思路: 用BFS分别以‘Y’和‘M’的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到‘@’更行最小值. PS: 如果用‘Y’和‘M’点分别去搜每个 ...

  7. BFS(最短路) HDU 2612 Find a way

    题目传送门 /* BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值 */ /***************************************** ...

  8. 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 ...

  9. HDU 2612 Find a way(找条路)

    HDU 2612 Find a way(找条路) 00 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)   Problem  ...

随机推荐

  1. [C++]求解三元一次方程组

    /** * author:johnny zen * date:2017-09-20 11:19 * function:Calculate Ternary system of equations * n ...

  2. js给<img>的src赋值

    用js原生方法:document.getElementById("imageId").src = "xxxx.jpg";用Jquery方法:$("#i ...

  3. Python 爬虫学习

    #coding:utf-8 #author:Blood_Zero ''' 1.获取网页信息 2.解决编码问题,通过charset库(默认不安装这个库文件) ''' import urllib impo ...

  4. SSH开发环境搭建

    断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.x ...

  5. TCP建立流程 【转】

    解决TCP连接数过多的问题 TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题 TCP状态迁移 大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基 ...

  6. java FTPClient 上传文件 0kb 问题

    解决方法: 1.本地防火墙关闭了2.服务端端防火墙关闭 CentOS 7.0关闭默认防火墙启用iptables防火墙 操作系统环境:CentOS Linux release 7.0.1406(Core ...

  7. javascript 搞不清原型链和constructor

    prototype.constructor仅仅可以用于识别对象是由哪个构造函数初始化的,仅此而已. var one=new Person(‘js’); 要解释这个结果就要仔细研究一下new这个操作符了 ...

  8. Windows不能在本地计算机启动MongoDB,错误代码 100

    今天在计算机上面启动MongoDB时,直接给我报错,Windows不能在本地计算机启动MongoDB,服务错误代码 100. 这种问题解决方法是: 找到data文件夹db下面的mongod.lock文 ...

  9. LeetCode(52):N皇后 II

    Hard! 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方 ...

  10. git提交本地分支到远程分支

    git提交本地分支到远程分支   git 常用命令(含删除文件) Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/j ...