#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
//#define INPUT
using namespace std;
/**
Problem : ZOJ1649 - Rescue
Begin Time : 7:00 p.m. 17th/Mar/2012
End Time : 22:17 17th/Mar/2012
Knowledge:
BFS+标记技巧
Thought:
其实是反着来搜索的,是点a去找点r们,而不是点r去找点a
移动按照普通的深搜移动规则就好。
但是对于每个点是否已经访问过不是像往常那样
vis[i][j] = 1就完事儿了,我们在_time数组里判断某个点是否已经找过
换言之,只有当(i,j)访问(i,j+1)的时候,(i,j)到(i,j+1)的代价小于
原来(i,j+1)的代价才准许访问。
这点跟那个Nightmare是十分类似的。
其实也可以用优先队列来做。
Exp.:
ZOJ的数据是多组输入的,所以一定要
while(scanf("%d") != EOF )
*/
struct node
{
int x;
int y;
int _time;
};
const int dx[] = {0,0,-1,1};
const int dy[] = {1,-1,0,0};
char maze[210][210];
int _time[210][210];
node que[1000000];
int startx,starty;
bool check(node tmp,int N,int M)
{
if ( tmp.x >= N || tmp.x < 0
|| tmp.y >= M || tmp.y < 0
|| maze[tmp.x][tmp.y] == '#'
||
(_time[tmp.x][tmp.y] != 0 && _time[tmp.x][tmp.y] < tmp._time )
)
return false;
return true;
}
void Solve(int N,int M)
{
bool isFound =false;
int front = 1, rear = 2;
int btime = 1000000;
node tmp,tmp1;
tmp.x = startx;
tmp.y = starty;
tmp._time = 0;
que[front] = tmp;
while( front < rear )
{
tmp = que[front];
_time[tmp.x][tmp.y] = tmp._time;
if( maze[tmp.x][tmp.y] == 'r' )
{
///找到朋友们
isFound = true;
if ( _time[tmp.x][tmp.y] < btime )
btime = _time[tmp.x][tmp.y];
}
///为某个点打上时间标记。
for(int i = 0 ; i < 4 ; i++)
{
tmp1.x = tmp.x + dx[i];
tmp1.y = tmp.y + dy[i];
if( tmp1.x < N && tmp1.x >= 0
&& tmp1.y < M && tmp1.y >= 0)
{
if( maze[tmp1.x][tmp1.y] == 'x')
tmp1._time = tmp._time + 2;
else
tmp1._time = tmp._time + 1;
if( check(tmp1,N,M) )
{
que[rear++] = tmp1;
}
}
}
front++;
}
if( isFound )
{
printf("%d\n",btime);
}
else
{
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
}
int main()
{
int n,m;
node tp;
char t[5];
#ifdef INPUT
freopen("b:\\acm\\zoj1649\\input.txt","r",stdin);
#endif
while ( scanf("%d%d",&n,&m) != EOF )
{
memset(maze,0,sizeof(maze));
memset(_time,0,sizeof(_time));
memset(que,0,sizeof(que));
gets(t);
for(int i = 0 ; i < n ; i++)
{
gets(maze[i]);
// gets(t);
for ( int j = 0 ; j <m ; j++)
{
if( maze[i][j] == 'a' )
{
startx = i;
starty = j;
}
}
}
Solve(n,m);
}
// cout << "Hello world!" << endl;
return 0;
}