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;
}
}