链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242
可能会有多个朋友去救angel。。当一个朋友已经把守卫打死后,另一个朋友就不受该守卫的影响了
所有,从A开始,搜索R比较容易实现....bfs
#include <iostream>
#include <queue>
#define MAX_N 205
#define INF 1000000
using namespace std;
typedef pair<int ,int > P;
char maze[MAX_N][MAX_N];
int d[MAX_N][MAX_N];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n,m;
int gx,gy; //终点坐标
queue<P> que;
void init(void) //初始化
{
while(!que.empty())
que.pop();
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
d[i][j]=INF;
}
void findg(void)
{
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(maze[i][j]=='a')
{
gx=i;
gy=j;
return;
}
}
int bfs(int gx,int gy) //从终点向起点搜索
{
que.push(make_pair(gx,gy));
d[gx][gy]=0;
while(que.size())
{
P p=que.front();
que.pop();
if(maze[p.first][p.second]=='r') //已找到
return d[p.first][p.second];
for(int i=0;i<4;i++)
{
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(0<=nx&&nx<n&&0<=ny&&ny<m&&maze[nx][ny]!='#'&&d[nx][ny]==INF)
{
que.push(make_pair(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
if(maze[nx][ny]=='x') //如果为守卫,
d[nx][ny]+=1;
}
}
}
return -1;
}
int main()
{
int i;
int ans;
while(cin>>n>>m)
{
init();
ans=INF;
for(i=0;i<n;i++)
cin>>maze[i];
findg();
ans=bfs(gx,gy);
if(ans==-1)
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
else
cout<<ans<<endl;
}
return 0;
}