/*步数最小的不一定是时间最少的 常规的bfs只能求出步数最少的。 而在这题中一个点可以多次走,所以必须记录最优的那个值 */ #include<stdio.h> #include<queue> #include<string.h> using namespace std; #define inf 0x3fffffff #define N 300 char s[N][N]; struct node { int x,y,step,time; }ss,tt,next; int n,m; int mintime[N][N]; int dis[4][2]={1,0,-1,0,0,1,0,-1}; int judge(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]!='#') return 1; return 0; } int bfs() { queue<node>q; q.push(ss); int i; ss.step=0; ss.time=0; q.push(ss); mintime[ss.x][ss.y]=0; while(!q.empty()) { ss=q.front(); q.pop(); for(i=0;i<4;i++) { int xx=next.x=ss.x+dis[i][0]; int yy=next.y=ss.y+dis[i][1]; next.step=ss.step+1; next.time=ss.time+1; if(judge(xx,yy)) { if(s[xx][yy]=='x')next.time+=1; if(next.time<mintime[xx][yy]) {//重点 mintime[xx][yy]=next.time; q.push(next); } } } } return mintime[tt.x][tt.y]; } int main() { int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%s",s[i]+1); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { mintime[i][j]=inf;//初始化 if(s[i][j]=='r') { ss.x=i; ss.y=j; } if(s[i][j]=='a') { tt.x=i; tt.y=j; } } k=bfs(); if(k>=inf) printf("Poor ANGEL has to stay in the prison all his life. "); else printf("%d ",k); } return 0; }