hdu1242 Rescue 优先队列BFS

Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.

题解:某某被困在一个地方,他朋友要去解救他(朋友不止一个)。在杀死守卫增加一秒的条件下求出最短的时间救出他。

定义结构体是必要的,保存每步的时间并且更新,使用优先队列,优先队列的判断条件是结构体里面的友元函数:按照最少的时间(tmp)来排列。然后BFS搜索之。

#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long
#define maxn 1001
#define INF 2147483646
using namespace std;
#define eps 1e-7
#define pi acos(-1.0)
int n,m,sx,sy,ans;
char a[maxn][maxn];
int vit[maxn][maxn];
int f[4][2]={0,1,1,0,0,-1,-1,0};
struct node {
    int x;
    int y;
    int tmp;
    friend bool operator < (const node &s,const node &b)//友元函数,优先队列的判定条件
    {
        return s.tmp>b.tmp;
    }
};
int bfs(int x,int y)
{
    priority_queue<node>Q;
    node s,q;
    memset(vit,0,sizeof(vit));
    s.x=x;
    s.y=y;
    s.tmp=0;
    vit[s.x][s.y]=1;
    Q.push(s);
    while(!Q.empty())
    {
        s=Q.top();
        Q.pop();
        if(a[s.x][s.y]=='r')
            return s.tmp;
        for(int i=0;i<4;i++)
        {
            q.x=s.x+f[i][0];
            q.y=s.y+f[i][1];
            if(q.x>=1&&q.x<=n&&q.y>=1&&q.y<=m&&a[q.x][q.y]!='#'&&!vit[q.x][q.y])
            {
                vit[q.x][q.y]=1;
                if(a[q.x][q.y]=='x')
                    q.tmp=s.tmp+2;
                else
                    q.tmp=s.tmp+1;
                Q.push(q);
            }
        }
    }
    return 0;
}
int main()
{
    while(cin>>n>>m)
    {
        ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='a')
                sx=i,sy=j;
        }
        ans=bfs(sx,sy);
        if(ans>0)
            cout<<ans<<endl;
        else
            cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值