HDU 1242

题意:有一个人被困在监狱了,他的朋友想去救他,x代表守卫,a代表这个人,r代表他的朋友,#代表墙,问朋友找他最小的时间,移动一格时间+1,如果那地方是守卫,杀死守卫也需要+1时间;

思路:和HDU 1240差不多,记忆最短路径。

但这题有个坑点,就是他的朋友可能有多个,我读题的时候没看到... 直接超时4发

#include<iostream>
#include<cstdio>
#include<cstring>
#include<climits>
using namespace std;
const int qq=200+5,no=1e7;
char map[qq][qq];
int dis[qq][qq],n,m,minx;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void dfs(int x,int y,int cnt)
{
    if(x<0||y<0||x>=n||y>=m)    return;
    if(map[x][y]==‘#‘)    return;
    if(cnt>=dis[x][y])    return;
    else    dis[x][y]=cnt;
    if(cnt>=minx)    return;
    if(map[x][y]==‘r‘)    if(cnt<minx)    minx=cnt;
    if(map[x][y]==‘x‘)    ++cnt;
    for(int i=0;i<4;++i)
        dfs(x+dx[i],y+dy[i],cnt+1);
    return;
}
int main()
{
    while(cin >> n >> m){
        int sx,sy;
        for(int j,i=0;i<n;++i)
            for(j=0;j<m;++j){
                cin >> map[i][j];
                if(map[i][j]==‘a‘){
                    sx=i;sy=j;
                }
                dis[i][j]=no;
            }
    minx=INT_MAX;
    dfs(sx,sy,0);
    if(minx!=INT_MAX)    cout << minx << endl;
    else    cout << "Poor ANGEL has to stay in the prison all his life."  << endl;
    }
}

%*c代表跳过这个变量;

时间: 2024-10-13 12:20:45

HDU 1242的相关文章

[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)

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

hdu 1242:Rescue(BFS广搜 + 优先队列)

Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 14   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Angel was caught by the MOLIGPY

HDU 1242 &amp;&amp; ZOJ 1649( BFS (队列 || 优先队列)).

~~~~ 突然发现一篇搜索的题目都有写.昨天发现道bfs题目,HDU上AC, ZOJ上WA.不得不说HDU上的数据之水.. 今天早起刷题有了思路,并用队列和单调队列都写了一遍,0MS飘过~~ ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 ~~~~ 首先有坑的地方是friends,对嘛,朋友有很多,ang

HDU 1242 Rescue营救 BFS算法

题目链接:HDU 1242 Rescue营救 Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16524    Accepted Submission(s): 5997 Problem Description Angel was caught by the MOLIGPY! He was put in prison by

HDU 1242——Rescue(优先队列)

题意: 一个天使a被关在迷宫里,她的许多小伙伴r打算去救她,求小伙伴就到她需要的最小时间.在迷宫里有守卫,打败守卫需要一个单位时间,如果碰到守卫必须要杀死他 思路: 天使只有一个,她的小伙伴有很多,所以可以让天使找她的小伙伴,一旦找到小伙伴就renturn.时间小的优先级高.优先队列搞定 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<

HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 开始以为是水题,想敲一下练手的,后来发现并不是一个简单的搜索题,BFS做肯定出事...后来发现题目里面也有坑 题意是从r到a的最短距离,"."相当时间单位1,"x"相当时间单位2,求最短时间 HDU 搜索课件上说,这题和HDU1010相似,刚开始并没有觉得像剪枝,就改用  双向BFS   0ms  一Y,爽! 网上查了一下,神牛们竟然用BFS+

ZOJ 1649 &amp;&amp; HDU 1242 Rescue

Rescue Time Limit: 2 Seconds      Memory Limit: 65536 KB 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

[ACM] hdu 1242 【BFS】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242 参考链接:http://www.acmerblog.com/hdu-1242-Rescue-1605.html 普通队列+bfs确实是蒙对的,因为击败守卫需要消耗时间1,因此普通队列每一次出队列的元素只是步数上最优,但不一定是时间上最优的,这时即使我们把整个迷宫搜完以最小值为最优依然不行,因为每一步处理完成都会把该状态标记为已处理vis[i][j]=1,因此,只要有一步不是最优,就会影响后面的