HDU 1242 Rescue(bfs+优先队列)

来源:互联网 发布:linux 百度云盘同步 编辑:程序博客网 时间:2024/05/20 17:27

Description
一个n*m地图,r为起点,a为终点,x是守卫,.可以走,#不可走,走一步需要一单位时间,如果要走守卫所在位置需多花一单位时间,问从起点到终点的最短用时
Input
第一行两个整数n和m表示地图规模,之后一个n*m矩阵表示该地图(n,m<=200)
Output
输出起点到终点的最短用时
Sample Input
这里写图片描述
Sample Output
13
Solution
点有两种,耗时为1的普通点和耗时为2的守卫点,在bfs过程中用优先队列维护点,每次拿出耗时最少的点扩张
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 222struct node{    int x,y,step;    bool operator <(const node &b)const    {        return step>b.step;    }};int dx[]={-1,0,1,0};int dy[]={0,-1,0,1};int n,m,dis[maxn][maxn];char s[maxn][maxn];int bfs(node a){    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            dis[i][j]=INF;    dis[a.x][a.y]=0;    priority_queue<node>que;    que.push(a);    while(!que.empty())    {        node now=que.top();        que.pop();        int x=now.x,y=now.y,step=now.step;        if(s[x][y]=='a')return step;        for(int i=0;i<4;i++)        {            int xx=x+dx[i],yy=y+dy[i];            if(xx<1||xx>n||yy<1||yy>m||s[xx][yy]=='#')continue;            node temp;            temp.x=xx,temp.y=yy,temp.step=step+1;            if(s[xx][yy]=='x')temp.step++;            if(dis[xx][yy]>temp.step)            {                dis[xx][yy]=temp.step;                que.push(temp);            }        }    }    return INF;}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=1;i<=n;i++)scanf("%s",s[i]+1);        node a;        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)                if(s[i][j]=='r')a.x=i,a.y=j,a.step=0;        int ans=bfs(a);        if(ans!=INF)printf("%d\n",ans);        else printf("Poor ANGEL has to stay in the prison all his life.\n");    }    return 0;}
原创粉丝点击