题目链接:点击查看

题目大意:给出一个迷宫,一个男孩和一个女孩还有两只鬼,男孩每秒钟走3格,女孩每秒钟走1格,鬼每秒钟向四周分裂2格,问男孩和女孩能否在鬼占领迷宫之前汇合,能的话输出汇合时间,否则输出-1

题目分析:双向bfs模板题,不过在我看来双向bfs和单向bfs没什么区别,就是格式上有点不一样,对于这个题目每次男孩bfs一次,然后女孩bfs一次,注意实时判断当前格子是否已经被鬼占领,每次向外扩展的时候也不需要用vis数组标记重复了,只需要在原迷宫的基础上打上自己的特殊符号即可,只要另一方遍历到该符号即代表两人相遇,就可以及时返回了

这个题目有一个需要注意的地方,一开始没仔细看题目,想当然的以为M代表的是女生,G代表的是男生,结果正好相反了,当时调了有点时间,回去仔细读了一遍题才发现的。。

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=810;const int b[4][2]={0,1,0,-1,1,0,-1,0};int n,m,k,step,ans;char maze[N][N];struct Node
{int x,y;Node(int X,int Y){x=X;y=Y;}Node(){}
}ghost[2];queue<Node>gg,mm;bool check(int x,int y)
{if(x<0||y<0||x>=n||y>=m)return false;if(maze[x][y]=='X')return false;for(int i=0;i<2;i++)if(step*2>=abs(x-ghost[i].x)+abs(y-ghost[i].y))return false;return true;
}bool bfsgg()
{for(int tt=1;tt<=3;tt++){queue<Node>q(gg);while(!q.empty()){Node cur=q.front();q.pop();gg.pop();if(!check(cur.x,cur.y))continue;for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];if(!check(xx,yy))continue;if(maze[xx][yy]=='M')continue;if(maze[xx][yy]=='G')return true;maze[xx][yy]='M';gg.push(Node(xx,yy));}}}return false;
}bool bfsmm()
{queue<Node>q(mm);while(!q.empty()){Node cur=q.front();q.pop();mm.pop();if(!check(cur.x,cur.y))continue;for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];if(!check(xx,yy))continue;if(maze[xx][yy]=='G')continue;if(maze[xx][yy]=='M')return true;maze[xx][yy]='G';mm.push(Node(xx,yy));}}return false;
}bool solve()
{while(!gg.empty())gg.pop();while(!mm.empty())mm.pop();step=k=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(maze[i][j]=='G')mm.push(Node(i,j));else if(maze[i][j]=='M')gg.push(Node(i,j));else if(maze[i][j]=='Z'){ghost[k].x=i;ghost[k].y=j;k++;}while(!mm.empty()&&!gg.empty()){step++;if(bfsgg()||bfsmm()){ans=step;return true;}}return false;
}int main()
{
//  freopen("input.txt","r",stdin);int w;cin>>w;while(w--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%s",maze[i]);if(solve())printf("%d\n",ans);elseprintf("-1\n");}return 0;
}

HDU - 3085 Nightmare Ⅱ(双向bfs)相关推荐

  1. HDU 3085 Nightmare Ⅱ【BFS +曼哈顿距离+综合性较强】

    Nightmare Ⅱ Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total S ...

  2. 专题训练二 搜索进阶 HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离)

    HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离) Problem Description Last night, little erriyue had a horrible ...

  3. HDU3085 Nightmare Ⅱ —— 双向BFS + 曼哈顿距离

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Other ...

  4. G - Nightmare Ⅱ (双向BFS)

    题目链接:SDTBU-ACM集训队暑期集训---第一讲 - Virtual Judge Last night, little erriyue had a horrible nightmare. He ...

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

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

  6. hdu 3567(八码数 + 双向bfs)

    题目连接:https://vjudge.net/contest/353606#problem/B 参考文章:https://blog.csdn.net/laaahu/article/details/9 ...

  7. 浅谈迷宫搜索类的双向bfs问题(例题解析)

    文章目录 前言 bfs类问题 双向bfs 例题实战 前言 文章若有疏忽还请指正,更多精彩还请关注公众号:bigsai 在搜索问题中,以迷宫问题最具有代表性,无论是八皇后的回溯问题,还是dfs找出口,b ...

  8. [题解](双向bfs)hdu_3085_Nightmare Ⅱ

    发现直接搜索比较麻烦,但是要同时两个人一起走容易想到双向bfs,比较普通, 在判断是否碰到ghost时只要比较两点的曼哈顿距离大小和step*2(即ghost扩散的距离)即可,仔细思考也是可以想到的 ...

  9. UVA1601The Morning after Halloween 单向加双向bfs

    题意:w*h(w,h16)网格上有n(n3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右四个方向之一移动),但每步结束之后任何两个鬼不能占用同一 ...

最新文章

  1. Spring MVC之DispatcherServlet请求处理(二)
  2. BASH Shell 简易进度条小函数
  3. java安全编码指南之:敏感类的拷贝
  4. ldap seach java_从LDAP(Java)检索信息
  5. android 闪存软件测试,手机为什么这么卡:闪存I/O测试AndroBench
  6. hive 修改分桶数 分桶表_疯狂Hive之DDL操作二(三)
  7. 学会Web前端,高薪工作任你挑!
  8. 面试准备每日系列:计算机底层之并发编程(三)JVM-垃圾回收
  9. Java继承,接口,抽象类
  10. [Swustoj 24] Max Area
  11. simulink中不能改名_王者荣耀:万格改名教学,空白名、重复名、个性符号名改法技巧!...
  12. 2020年11月程序员工资统计,平均14327元
  13. PHP-thinkPHP快速入门
  14. 电脑管理android手机版下载安装,airdroid下载
  15. 算POTCAR要上心!
  16. 中国最大的系统软件开发外包公司排行榜有哪些
  17. 算法思想为什么重要,通过IMDB学习算法的设计思路
  18. 英语不好计算机好学吗,英语很差能学计算机专业吗
  19. list申请java,java把一个list中的内容添加到另一个list中 FPGA编程问题:有多个.v文件与module,把他们加到......
  20. 联想计算机怎么添加打印机,联想打印机怎么添加

热门文章

  1. MySQL连接查询—笛卡尔乘积
  2. ConcurrentHashMap的源码分析-addCount
  3. MyBatis 实际使用案例-一级标签
  4. 分布式架构的负载均衡算法
  5. 为什么需要Redis 集群
  6. ActiveMQ跟SpringBoot整合的双向队列
  7. 项目前端页面框架介绍
  8. MybatisPlus介绍
  9. spring配置详解-属性注入(构造函数)
  10. animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表