这题是搜索的好题,第一次做不会做,第二次还是勉强。。噗噗。。。要想真正会做,还是要自己想啊。。呜呜。。
//有多条路径,如何选出最短的那条就退出呢?
// 还以为是简单的bfs 但其实不是
//用优先队列 又做了一遍还是不对
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int r,c;
char map[210][210];
bool vis[210][210];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
struct Node
{
int x,y;
int t;
friend bool operator<(Node n1,Node n2)
{
return n2.t<n1.t;
} // 优先队列 按照最短时间排序
}s,e;
int bfs()
{
int mmin=8008,flag=0;
priority_queue<Node> q;
q.push(s);
while(!q.empty())
{
Node u=q.top();
vis[u.x][u.y]=true;
q.pop();
for(int i=0;i<4;i++)
{
Node v;
v.x=u.x+dx[i];
v.y=u.y+dy[i];
if(!vis[v.x][v.y] && v.x>=0 && v.x<r && v.y>=0 && v.y<c)
{
if(map[v.x][v.y]=='x')v.t=u.t+2;
else v.t=u.t+1;
if(v.x==e.x && v.y==e.y)
{
flag=1;
mmin=mmin<v.t?mmin:v.t;
}
vis[v.x][v.y]=true;
q.push(v);
}
}
}
if(flag)return mmin;
else return -1;
}
int main()
{
int i,j;
while(cin>>r>>c)
{
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cin>>map[i][j];
if(map[i][j]=='a'){s.x=i;s.y=j;s.t=0;vis[i][j]=false;}
else if(map[i][j]=='r') {e.x=i;e.y=j; vis[i][j]=false;}
else if(map[i][j]=='x')vis[i][j]=false;
else if(map[i][j]=='.')vis[i][j]=false;
else{vis[i][j]=true;}
} //边输入边初始化
}
int ans=bfs();
if(ans==-1)printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",ans);
}
}