#include<iostream>
#include<queue>
using namespace std;
char a[205][205],guodu[205][205];
int t[205][205],guodu2[205][205];
int map[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int x,y,counter;

 

struct node
{
    int x;
    int y;


};
node duostart[40000],start,temp,end;


int bfs(queue<struct node>qu,int han,int lie)
{
    int i,v;
    while(!qu.empty())
    {
        temp=qu.front();
        qu.pop();

        for(i=0;i<4;i++)
        {
            x=temp.x+map[i][0];
            y=temp.y+map[i][1];
            if(x>=0 && x<lie && y>=0 && y<han && !(a[y][x]=='#'))
            {
                start.x=x;
                start.y=y;

                v=t[temp.y][temp.x]+1;
                if(a[y][x]=='x')
                    v++;
                if(v<t[start.y][start.x])
                {
                    qu.push(start);
                    t[start.y][start.x]=v;
                }

            }
        }
        
    }
    
    if(t[end.y][end.x]!=9999)
        return t[end.y][end.x];
    else
        return 0;
}

 

int main()
{
    int han,lie,i,j,k,counter,min,jilu;
    while((cin>>han>>lie)!=NULL)
    {
        counter=0;
        min=9999;
        for(i=0;i<han;i++)
            for(j=0;j<lie;j++)
                t[i][j]=9999;
        queue<struct node>qu;
        for(i=0;i<han;i++)
            for(j=0;j<lie;j++)
            {
                cin>>a[i][j];
                if(a[i][j]=='r')
                {
                    duostart[counter].x=j;
                    duostart[counter].y=i;
                    a[i][j]='#';
                    t[i][j]=0;
                    counter++;
                }
                if(a[i][j]=='a')
                {
                    end.x=j;
                    end.y=i;
                    a[i][j]=';';
                }
                if(a[i][j]=='.')
                    a[i][j]=';';
            }
        for(i=0;i<han;i++)
            for(j=0;j<lie;j++)
                guodu[i][j]=a[i][j];

        for(i=0;i<han;i++)
            for(j=0;j<lie;j++)
                guodu2[i][j]=t[i][j];


        for(i=0;i<counter;i++)
        {
            qu.push(duostart[i]);
            jilu=bfs(qu,han,lie);
            if(min>jilu && jilu!=0)
            {
                min=jilu;
            }
            for(k=0;k<han;k++)
                for(j=0;j<lie;j++)
                    a[k][j]=guodu[k][j];
            for(k=0;k<han;k++)
                for(j=0;j<lie;j++)
                    t[k][j]=guodu2[k][j];
        }
        if(min!=9999)
            cout<<min<<endl;
        else
            cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
    }
    return 0;
}

 

posted on 2010-05-12 11:01  VRS  阅读(336)  评论(0)    收藏  举报