题意:最短时间内被伙伴找到,
思路:因为有多个伙伴,所以可以公主找伙伴,bfs就好,守卫需要2s,遇到守卫二次入队列就行了.
#include <stdio.h>
#include <string.h>
#define MAX 300
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
char map[MAX][MAX];
int n,m;
int visit[MAX][MAX];
int to[4][2]={1,0,-1,0,0,1,0,-1};
int que[MAX*MAX][3];
int check(int x,int y){
if(x<0||y<0||x>=n||y>=m||visit[x][y]||map[x][y]=='#')return 0;
return 1;
}
void bfs(int x,int y){
int i,j,qqq;
visit[x][y]=1;
que[0][0]=x;
que[0][1]=y;
que[0][2]=0;
qqq=1;
i=0;
while(i<qqq){
if(map[que[i][0]][que[i][1]]=='r')break;
if(map[que[i][0]][que[i][1]]=='x'&&visit[que[i][0]][que[i][1]]==2){
que[qqq][0]=que[i][0];
que[qqq][1]=que[i][1];
que[qqq][2]=que[i][2]+1;
qqq++;
visit[que[i][0]][que[i][1]]=1;
i++;
continue;
}
for(j=0;j<4;j++){
if(check(que[i][0]+to[j][0],que[i][1]+to[j][1])){
que[qqq][0]=que[i][0]+to[j][0];
que[qqq][1]=que[i][1]+to[j][1];
que[qqq][2]=que[i][2]+1;
if(map[que[i][0]+to[j][0]][que[i][1]+to[j][1]]!='x')visit[que[qqq][0]][que[qqq][1]]=1;
else visit[que[qqq][0]][que[qqq][1]]=2;
qqq++;
}
}
i++;
}
if(i==qqq)printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",que[i][2]);
return ;
}
int main()
{
int i,j,x,y;
while(~scanf("%d%d",&n,&m)){
getchar();
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='a'){
x=i;
y=j;
}
}
getchar();
}
bfs(x,y);
}
return 0;
}