HDU 1242 (BFS+优先队列)

题意:X代表卫兵,a代表终点,r代表起始点,.代表路,#代表墙,走过.要花费一秒,走过x要花费2秒,求从起点到终点的最少时间。

析:一看到样例就知道是BFS了吧,很明显是最短路径问题,不过又加了一个条件——时间,所以我们用优先队列去优先获取时间短的路径,总体实现起来没有太大难度。

代码如下:

#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <iomanip>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <map>
#include <list>

using namespace std;
const int maxn = 200 + 10;
const int dr[] = {0, 0, 1, -1};
const int dc[] = {1, -1, 0, 0};
struct node{
    int r, c, t, d;
    node() { }
    node(int rr, int cc, int tt, int dd) : r(rr), c(cc), t(tt), d(dd) { }
    bool operator < (const node &p) const {
        if(t != p.t)  return t > p.t;
        return d > p.d;
    }
};

char a[maxn][maxn];
node s, e;
int r, c, d[maxn][maxn];

bool is_in(int rr, int cc){
    return rr < r && rr >= 0 && cc >= 0 && cc < c;
}

void bfs(){
    priority_queue<node> q;

    memset(d, -1, sizeof(d));
    d[s.r][s.c] = 0;
    q.push(s);
    while(!q.empty()){
        node u = q.top();  q.pop();

        if(u.r == e.r && u.c == e.c){  printf("%d\n", u.t);  return ;  }
        for(int i = 0; i < 4; ++i){
            int x = u.r + dr[i];
            int y = u.c + dc[i];
            if(is_in(x, y) && a[x][y] == ‘.‘ && d[x][y] < 0){
                d[x][y] = 1 + d[u.r][u.c];
                q.push(node(x, y, u.t+1, u.d+1));
            }
            else if(is_in(x, y) && a[x][y] == ‘x‘ && d[x][y] < 0){
                d[x][y] = 1;
                q.push(node(x, y, u.t+2, u.d+1));
            }
        }
    }

    printf("Poor ANGEL has to stay in the prison all his life.\n");
    return ;
}

int main(){
    while(~scanf("%d %d", &r, &c)){
        for(int i = 0; i < r; ++i)
            scanf("%s", a[i]);

        for(int i = 0; i < r; ++i)
            for(int j = 0; j < c; ++j)
                if(a[i][j] == ‘r‘) { s.r = i;  s.c = j;  s.t = 0;  s.d = 0;  }
                else  if(a[i][j] == ‘a‘) { e.r = i;  e.c = j;  e.t = 0;   a[i][j] = ‘.‘;  }
        bfs();
    }
    return 0;
}
时间: 2024-11-21 06:31:17

HDU 1242 (BFS+优先队列)的相关文章

HDU 1242 Rescue(优先队列+bfs)

题目地址:HDU 1242 这个题相比于普通的bfs有个特殊的地方,经过士兵时会额外消耗时间,也就是说此时最先搜到的时候不一定是用时最短的了.需要全部搜一遍才可以.这时候优先队列的好处就显现出来了.利用优先队列,可以让队列中的元素按时间排序,让先出来的总是时间短的,这样的话,最先搜到的一定是时间短的,就不用全部搜一遍了.PS:我是为了学优先队列做的这题..不是为了这题而现学的优先队列.. 代码如下: #include <iostream> #include <stdio.h> #i

HDU 1242 (BFS搜索+优先队列)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目大意:多个起点到一个终点,普通点耗时1,特殊点耗时2,求到达终点的最少耗时. 解题思路: 如果没有特殊点,就是普通BFS. 由于特殊点的介入,所以对于一个点,可能由不同种方式到达,所以使用优先队列,对于一个点,最先取出的点用的方式肯定是最优的. 同时使用优先队列也为BFS过程提供一个剪枝,因为最先到达肯定是最优结果,只要搜到第一个结果,后面就不用搜了. 注意有多个起点,所以先记录下所有起

hdu - 1242 Rescue (优先队列+bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1242 感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了. 但是别人说要用优先队列来保证时间最优,我倒是没明白,步数最优跟时间最优不是等价的吗?就算士兵要花费额外时间,可是既然先到了目标点那时间不也一定是最小的? 当然用优先队列+ a去搜索r是最稳妥的. 1 #include <cstdio> 2 #include <cstring> 3

HDU 2822 (BFS+优先队列)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同,应该先搜cost小的.直接退化为最短路问题. 优先队列优化. 卡输入姿势.如果O(n^2)逐个读的话会T掉.要用字符串读一行. #include "cstdio" #include "queue" #include "cstring" using

HDU 3619 BFS+优先队列

点击打开链接 题意:给一个地图,从S走到T,然后给了钥匙的位置,地图上数字点代表如果走这个点则要消耗数字的能量,而A到E是门,一个钥匙可以开一类门,问最少消耗多少能量就可以走到T 思路:对于钥匙来说,直接用状态压缩判断钥匙是否取过,然后因为是要走最小的花费,那么要用优先队列,没什么可以注意的,就是一个钥匙可以开一类门,而不是只能开一个门,注意着谢谢就应该能过,并不难的一道BFS #include <queue> #include <stdio.h> #include <ios

HDU 4308 BFS+优先队列

点击打开链接 题意:从Y走到C,#代表不能走,走*的话要花费C元,P是传送门可以到达任意一个P,问最小花费 思路:直接优先队列模拟一下就行,BFS搜一下,P直接记录,遇到了就判断它能到达的点能不能走就行了,easy #include <queue> #include <stdio.h> #include <iostream> #include <string.h> #include <stdlib.h> #include <algorith

[ACM] HDU 1242 Rescue (优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is:

[ACM] hdu 1242 Rescue (BFS+优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is:

hdu 1242 Rescue(bfs+优先队列)

Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is: approach Angel. We assume

hdu 1242 Rescue (BFS+优先队列)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1242 这道题目我是用BFS+优先队列做的.听说只用bfs会超时. 因为这道题有多个营救者,所以我们从被营救者开始bfs,找到最近的营救者就是最短时间. 先定义一个结构体,存放坐标x和y,还有到达当前点(x,y)消耗的时间. struct node { int x,y; int time; friend bool operator < (const node &a,const node &