思路:优先队列+BFS
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int n,m,ans;
string a[200];
int vis[200][200],ok;
int dir[4][2]={-1,0,0,1,1,0,0,-1};
struct node
{
int x,y,dis;
node(int _x=0,int _y=0,int _dis=0):x(_x),y(_y),dis(_dis){};
friend bool operator<(const node &a,const node & b)
{
return a.dis>b.dis;
}
};
node s,e;
void BFS()
{
ok=0;
priority_queue <node> q;
s.dis=0;
q.push(s);
vis[s.x][s.y]=1;
while(!q.empty())
{
node t=q.top();
q.pop();
for(int k=0;k<4;k++)
{
int i=t.x+dir[k][0];
int j=t.y+dir[k][1];
if(i>=0&&i<n&&j>=0&&j<m&&!vis[i][j]&&a[i][j]!='#')
{
vis[i][j]=1;
if(a[i][j]=='x')
{
q.push(node(i,j,t.dis+2));
}
else if(a[i][j]=='.')
{
q.push(node(i,j,t.dis+1));
}
else if(a[i][j]=='a')
{
ans=t.dis+1;
ok=1;
return;
}
}
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
cin>>a[i];
for(int j=0;j<m;j++)
{
if(a[i][j]=='a'){e.x=i;e.y=j;}
if(a[i][j]=='r'){s.x=i,s.y=j;}
}
}
BFS();
if(ok)cout<<ans<<endl;
else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
}