https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/I

【题意】

  • 给定一个n*m的迷宫,A的多个小伙伴R要去营救A,问需要时间最少的小伙伴是多长时间
  • 遇到'.'需要1分钟,遇到'x'需要两分钟,遇到'#'不能走

【思路】

  • 这道题的关键是遇到'.'和遇到'x'需要的时间不一样,所以不能用平常的BFS找最短路
  • vis数组不再是true和false两个状态来标记是否已经走过,而是记录最小步数的值
  • 不再是vis是false就加入队列,而是vis小于最小步数加入队列
  • 因为有多个R营救一个A,所以是以A为起点BFS

【Accepted】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue> using namespace std; int n,m;
const int maxn=2e2+;
const int inf=0x3f3f3f3f;
char str[maxn][maxn];
//bool vis[maxn][maxn];
int vis[maxn][maxn];
struct node
{
int x;
int y;
int step;
node(){}
node(int _x,int _y,int _s):x(_x),y(_y),step(_s){}
friend bool operator<(node nd1,node nd2)
{
return nd2.step<nd1.step;
}
}nd[maxn];
int dir[][]={{,},{-,},{,},{,-}};
bool check(int x,int y)
{
if(str[x][y]=='#') return false;
if(x<||x>=n||y<||y>=m) return false;
return true;
}
int BFS(int x,int y)
{
priority_queue<node> Q;
Q.push(node(x,y,));
vis[x][y]=;
while(!Q.empty())
{
node q=Q.top();
Q.pop();
if(str[q.x][q.y]=='r') return q.step;
for(int i=;i<;i++)
{
int x=q.x+dir[i][];
int y=q.y+dir[i][];
if(check(x,y))
{
int s;
if(str[x][y]=='x') s=q.step+;
else s=q.step+;
if(s<vis[x][y])
{
vis[x][y]=s;
Q.push(node(x,y,s));
}
}
}
}
return -;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(vis,inf,sizeof(vis));
int x,y;
for(int i=;i<n;i++)
{
scanf("%s",str[i]);
for(int k=;k<m;k++)
{
if(str[i][k]=='a')
{
x=i;
y=k;
}
}
}
int ans=BFS(x,y);
if(ans==-)
{
puts("Poor ANGEL has to stay in the prison all his life.");
}
else
{
printf("%d\n",ans);
}
}
return ;
}

BFS+优先级队列

【BFS+优先级队列】Rescue的更多相关文章

  1. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

  2. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  3. 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景

    说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已 经烂大街了...很简单,用“堆”去实现的,在我们系统中有一个订单催付 ...

  4. Java中的队列Queue,优先级队列PriorityQueue

    队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...

  5. 如何基于RabbitMQ实现优先级队列

    概述 由于种种原因,RabbitMQ到目前为止,官方还没有实现优先级队列,只实现了Consumer的优先级处理. 但是,迫于种种原因,应用层面上又需要优先级队列,因此需求来了:如何为RabbitMQ加 ...

  6. ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

    一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...

  7. java中PriorityQueue优先级队列使用方法

    优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...

  8. stl的优先级队列

    #include <iostream> #include <vector> #include <queue> using namespace std; class ...

  9. 【python cookbook】【数据结构与算法】5.实现优先级队列

    问题:要实现一个队列,它能够以给定的优先级对元素排序,且每次pop操作时都会返回优先级最高的那个元素: 解决方案:采用heapq模块实现一个简单的优先级队列 # example.py # # Exam ...

随机推荐

  1. angularjs 下select中ng-options使用

    当我有一堆object数据要用下拉框进行显示选择时,可以使用到angularjs中的select中的ng-options的属性.官网网址:https://docs.angularjs.org/api/ ...

  2. NIO客户端主要创建过程

    NIO客户端主要创建过程:   步骤一:打开SocketChannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址),示例代码如下:    SocketChannel client ...

  3. Java垃圾回收机制分析

    Java的堆是一个运行时数据区,类的实例从中分配空间,堆中存储着正在运行的应用程序所建立的所有对象.垃圾回收是一种动态存储管理技术.它按照特定的垃圾回收算法,自动释放掉不再被引用的对象.堆内存里垃圾的 ...

  4. vijos 1053 Easy sssp

    描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...

  5. promise 里面的 console.info 打印信息 并不准确,后期有修改对象数据,会覆盖,影响之前的显示

    promise 里面的 console.info 打印信息 并不准确,后期有修改对象数据,会覆盖,影响之前的显示

  6. vscode F12 不能用,原来是快捷键冲突了。

    vscode F12 不能用,原来是快捷键冲突了.

  7. Mac 查看端口情况

    一个进程可以占用多个端口. 查看某个进程占用哪些端口: lsof -nP | grep TCP | grep -i 进程名 ➜ cocos_creator lsof -nP | grep TCP | ...

  8. CNN完成mnist数据集手写数字识别

    # coding: utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data d ...

  9. vs2010的资源视图中,对话框显示数字的解决方法之一

    以上是不正常显示. 我这次遇到该问题的原因是资源名IDD_DLG_INTENSITY重复定义导致的, 所以在resource.h文件中去除重复定义就好了. 正常应该显示DD_XXX,如下图所示

  10. PHP09 字符串和正则表达式

    学习要点 字符串处理简介 常用的字符串输出函数 常用的字符串格式化函数 字符串比较函数 正则表达式简介 正则表达式语法规则 与perl兼容的正则表达式函数    字符串处理介绍 Web开发中字符串处理 ...