hdoj1242bfs入门

原创 2015年02月07日 18:39:09

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
int d[210][210];
using namespace std;
const int inf=0x7fffffff;
char field[210][210];
int n,m,sx,sy;
int fx[4]={0,0,-1,1};
int fy[4]={1,-1,0,0};
struct pos
{
    int x,y,step;
};
int bfs()
{
    queue<pos> que;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        d[i][j]=inf;
    d[sx][sy]=0;
    pos tmp,next;
    tmp.x=sx;
    tmp.y=sy;
    tmp.step=0;
    que.push(tmp);
    int minn=inf;
    while(!que.empty())
    {
        tmp=que.front();
        que.pop();
        if(field[tmp.x][tmp.y]=='r')
            minn=min(minn,d[tmp.x][tmp.y]);
        for(int i=0;i<4;i++)
        {
            int nx=tmp.x+fx[i];
            int ny=tmp.y+fy[i];
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&field[nx][ny]!='#')
            {
                if(d[nx][ny]>tmp.step+1)
                {
                    next.x=nx;
                    next.y=ny;
                    next.step=tmp.step+1;
                    if(field[nx][ny]=='x')
                        next.step++;
                    que.push(next);
                    d[nx][ny]=next.step;
                }
            }
        }
    }
    return minn;
}
int main()
{
    while(cin>>n>>m)
    {
        memset(d,0,sizeof(d));
        for(int i=0;i<n;i++)
            scanf("%s",field[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(field[i][j]=='a')
                {
                    sx=i;
                    sy=j;
                }
        int res=bfs();
        if(res==inf)
            printf("Poor ANGEL has to stay in the prison all his life.\n");
        else
            printf("%d\n",res);
    }
    return 0;
}

题目大意:一个n*m的监狱,a表示天使,r表示天使的朋友,x表示守卫,.表示路,#表示墙。天使的朋友要去救天使,碰到守卫会增加1s的用时。题意是说有多个朋友,但据说测试数据中都是只有一个朋友的情况。不过我还是按有多个朋友解决。就是从天使作为起点,朋友作为你终点,在所有终点中找最小的那个。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)

Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is...

HDOJ 1242 Rescue (BFS + 优先队列)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242 一、题目描述 =========================================...

hdoj 1242 Rescue (bfs+优先队列)

运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能...

hdoj 1242 不同步的bfs

以前曾经做过每一步都是平等的bfs 今天的这一题让我开阔了视野 因为上一步和下一步所花费的时间可能不同 下一步的来源可以分为两种情况 1 来自时间短的 2 来自时间长的 因此我们必...

迷宫问题:hdoj1242--BFS基本应用

#include using namespace std; const int MAX=205; char map[MAX][MAX]; int bfs_search(int si,int sj...

HDOJ 1242 Rescue (BFS+优先队列)

http://acm.hdu.edu.cn/showproblem.php?pid=1242 题意:天使被关入了恶魔的监狱,他的朋友们要救他出去,根据给出的“地图“求他的朋友们到达他的位置的最短时间...
  • sdc1992
  • sdc1992
  • 2012年08月17日 09:39
  • 1406

HDOJ 1242 Rescue(BFS + 优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. Th...

hdoj 1242 Rescue(bfs)

【题目大意】:某人a被关在了监狱里,监狱里有路有墙有看守者x,他的朋友们r想去营救他出来,但没前进一个需要消耗时间1,每遇到一个守卫又要花费时间1去杀死他,问最少多少时间可以把a救出来,救不出来输出"...
  • new_wu
  • new_wu
  • 2012年03月12日 17:25
  • 387

hdoj 1242 Rescue (BFS)

Rescue http://acm.hdu.edu.cn/showproblem.php?pid=1242 Time Limit: 2000/1000 MS (Java/Others)    Mem...

HDOJ 1242/ZOJ 1649 Rescue

【题号】HDOJ 1242/ZOJ 1649 【题目描述】 Rescue Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 65536...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj1242bfs入门
举报原因:
原因补充:

(最多只允许输入30个字)