1 /*
2 优先队列
3 */
4
5 #include<stdio.h>
6 #include<iostream>
7 #include<cstdlib>
8 #include<string.h>
9 #include<queue>
10 #define HH 11111111
11 using namespace std;
12 char a[202][202];
13 int visit[202][202];
14 int n,m;
15 int map[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
16 struct node
17 {
18 friend bool operator< (node n1,node n2)
19 {
20 return n1.p>n2.p;
21 }
22 int p;
23 int x;
24 int y;
25 };
26 void bfs(int x,int y)
27 {
28 int i,x1,y1;
29 priority_queue<node>b;
30 while(!b.empty())
31 {
32 b.pop();
33 }
34 node tmp,tmp1;
35 tmp.x=x;
36 tmp.y=y;
37 tmp.p=0;
38 b.push(tmp);
39 visit[x][y]=1;
40 while(b.size()>0)
41 {
42 tmp=b.top();
43 b.pop();
44 for(i=0;i<4;i++)
45 {
46 x1=tmp.x+map[i][0];
47 y1=tmp.y+map[i][1];
48 if(x1>=1&&x1<=n && y1>=1&&y1<=m && visit[x1][y1]==0 && a[x1][y1]!='#')
49 {
50 if(a[x1][y1]=='x')
51 visit[x1][y1]=tmp.p+2;
52 else if(a[x1][y1]=='.' || a[x1][y1]=='r')
53 visit[x1][y1]=tmp.p+1;
54 tmp1=tmp;
55 tmp.x=x1;
56 tmp.y=y1;
57 tmp.p=visit[x1][y1];
58 b.push(tmp);
59 tmp=tmp1;
60 if(a[x1][y1]=='r')return;
61 }
62 }
63 }
64 }
65 int main()
66 {
67 int i,j,num;
68 while(scanf("%d%d",&n,&m)>0)
69 {
70 for(i=1;i<=n;i++)
71 scanf("%s",a[i]+1);
72 memset(visit,0,sizeof(visit));
73 for(i=1;i<=n;i++)
74 for(j=1;j<=m;j++)
75 {
76 if(a[i][j]=='a')
77 {
78 bfs(i,j);
79 }
80 }
81 num=HH;
82 for(i=1;i<=n;i++)
83 for(j=1;j<=m;j++)
84 {
85 if(a[i][j]=='r' && visit[i][j]!=0 && visit[i][j]<num)
86 num=visit[i][j];
87 }
88 if(num==HH)
89 printf("Poor ANGEL has to stay in the prison all his life.\n");
90 else
91 printf("%d\n",num);
92 }
93 return 0;
94 }