传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1242

一般的bfs只能求出的最解,优解通常是步数最少的,但在此题中不一定是时间最少的解,如下图,步数依次是8,8,8,12,时间是13,13,14,12,反而第四种是要求解,一看此题就是用bfs求解,这里可以用结构体定义一个time域,定义一个int mintime[MAX][MAX],在搜寻四个方向时只有比前一个时间短的时间的节点(结构体)才能入队。

因为有最小时间的判断,就算没有用visit数组也不会无线搜下去,在搜索左边一个点,到右边一个点。右边一个点就不会搜索左边一个点了,因为左边一个点的mittime肯定更小了,再次是因为到达(x,y)位置的最少时间肯定有下限的。最后返回要就得人的位置坐标的时间就行了。

ps:其实没必要开一个mintime数组吧,把走过X路的step多加1,比较step就行了

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int MAX = 200;
const int INF = 1000000;struct point{int x,y;int step;int time;};queue<point>que;int N,M;char mp[MAX][MAX];int mintime[MAX][MAX];int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};int ax,ay;int bfs(point s)
{int i;que.push(s);point hd; //从队列头出队列的位置while(!que.empty()){//每次循环读入地图前需要初始化,因为每次输入的地图尺寸可能并不一样hd = que.front();que.pop();for(i=0;i<4;i++){int x = hd.x+dir[i][0];int y = hd.y+dir[i][1];if(x>=0&&x<N&&y>=0&&y<M&&mp[x][y]!='#'){point t;t.x=x;t.y=y;t.step=hd.step+1;t.time=hd.time+1;if(mp[x][y]=='x')t.time++;if(t.time<mintime[x][y]){mintime[x][y]=t.time;que.push(t);}}}}return mintime[ax][ay];
}int main()
{int i,j;while(scanf("%d%d",&N,&M)!=EOF){memset(mp,0,sizeof(mp));//每次循环读入地图前需要初始化,因为每次输入的地图尺寸可能并不一样point start;int fx,fy;for(i = 0;i<N;i++)scanf("%s",mp[i]);for(i = 0;i<N;i++){for(j = 0;j<M;j++){mintime[i][j]=INF;//去最小,则赋极大if(mp[i][j]=='a'){ax=i;ay=j;}else if(mp[i][j]=='r'){fx=i;fy=j;}}}start.x=fx;start.y=fy;start.time = 0;start.step=0;mintime[fx][fy]=0;//当前时间点赋值为0int mint = bfs(start);if(mint<INF)printf("%d\n",mint);elseprintf("Poor ANGEL has to stay in the prison all his life.\n");}return 0;
}

转载于:https://www.cnblogs.com/zhangmingzhao/p/7256718.html

HDU 1242 特殊化带结构体BFS相关推荐

  1. C#调用带结构体指针的C Dll的方法

    C#调用带结构体指针的C Dll的方法 原文:C#调用带结构体指针的C Dll的方法 在C#中调用C(C++)类的DLL的时候,有时候C的接口函数包含很多参数,而且有的时候这些参数有可能是个结构体,而 ...

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

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

  3. HDU 1242 Rescue BFS+优先队列

    题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1242 #include <stdio.h> #include <stri ...

  4. *【HDU - 1242 】 Rescue (反向dfs,或bfs)

    题干: Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N ...

  5. (step4.2.3)hdu 1242(Rescue——BFS)

    题目大意:friends用最短的时间去救angel '.'表示通道 '#'表示墙壁 'x'表示guard.走一格要一单位时间,杀死一个guard要一个单位时间. 如果可以救求最短时间,否则按要求输出 ...

  6. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  7. HDU 5836 Rubik's Cube BFS

    Rubik's Cube 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5836 Description As we all know, Zhu is ...

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

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

  9. HDU 1728 逃离迷宫【BFS】

    题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...

  10. HDU 5876 关于补图的bfs

    1.HDU 5876  Sparse Graph 2.总结:好题,把STL都过了一遍 题意:n个点组成的完全图,删去m条边,求点s到其余n-1个点的最短距离. 思路:把点分为两个集合,A为所有没有到达 ...

最新文章

  1. Java中的策略模式实例教程
  2. grub光盘修复,硬盘修复
  3. 基于Vue.js的后台管理系统组件开发
  4. 基于Win32Api创建窗口程序
  5. C#自定义控件,在项目工具箱中加入自定义控件,调用自定义控件
  6. Java生鲜电商平台-统一异常处理及架构实战
  7. linux oracle手动启动两个实例
  8. 七种寻址方式(寄存器间接寻址方式)
  9. python 2.7.11 linux,Python-2.7.11+Django-1.9.4安装配置
  10. 软件正在吞噬世界!如何拯救旧金山的开发者?
  11. python简单选择排序_Python实现冒泡,插入,选择排序简单实例
  12. 【渝粤教育】国家开放大学2018年春季 0689-21T老年心理健康 参考试题
  13. Hibernate---配置文件
  14. 数据库db2错误代码大全
  15. PyTorch - 数据集介绍(mnist、CIFAR10、CIFAR100)
  16. 计算机组成原理——微程序设计
  17. android黑域系统文件,优雅地使用安卓手机,黑域免root使用教程
  18. OpenCV人脸识别的原理 (原文完整版)
  19. java开源规则引擎比较_常用规则引擎比较分析
  20. 利用腾讯云函数搭建免费代理池

热门文章

  1. 编程计算二叉树中某结点的层数
  2. 量子计算机人类复活,死人有没有可能复活?从量子尺度来分析是有可能
  3. smartMeter
  4. Raki的统计学习方法笔记0xB(11)章:条件随机场
  5. 完整详尽的解决MySql:Could not create connection to database server
  6. html空间图片,html+js实现图片预览
  7. 第 7 章 Neutron - 079 - 在 ML2 中 enable local network
  8. 第2.2节 Python的语句
  9. Ubuntu改坏sudoers后无法使用sudo的解决办法
  10. Python pandas学习总结