就是天使的朋友要把天使从监狱里面救出来,怎样花费的时间最少,a代表天使,r代表天使的朋友,然后x代表怪物,天使的朋友可以杀掉怪物,但要花费更多的时间要花时间2,而#代表墙,.代表可以走的路,要花费时间1。要你求出可以救出天使的最少时间,若不能则输出-1.
解题思路:
按照我自己的思路的话,如果不用优先队列的话,按BFS搜索的话,最先找到的,不一定是最短的,而且最先找到的它走过的路都被标记了,就导致了真正最短有可能走它走过了的不能再走了,就这样我贡献了几次WA了。然后如果我们用优先队列的话,每走一步,所话的最小步数都保持在队列了头部,这样就可以保证所找到的步数一定是最小的。
编写代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
const int MAX = 202;
char map[MAX][MAX];
int visit[MAX][MAX];
int n,m,ax,ay,minx;
void dfs(int x,int y,int len){
if(x<0 || y<0 || x>=n || y>=m)return;
if(len>=minx)return;
if(map[x][y]=='#')return;
if(visit[x][y]==1)return;
if(map[x][y]=='r'){
if(len<minx)minx=len;
return;
}
if(map[x][y]=='x'){
++len;
}
visit[x][y]=1;
dfs(x+1,y,len+1);
dfs(x-1,y,len+1);
dfs(x,y+1,len+1);
dfs(x,y-1,len+1);
visit[x][y]=0;
}
int main(){
//freopen("in.txt","r",stdin);
int i,j,len;
while(scanf("%d %d%*c",&n,&m)!=EOF){
for(i=0;i<n;++i){
for(j=0;j<m;++j){
map[i][j]=getchar();
if(map[i][j]=='a'){
ax = i;
ay = j;
}
}
getchar();
}
len = 0;
minx = INT_MAX;
dfs(ax,ay,len);
if(minx!=INT_MAX){
printf("%d\n",minx);
}else{
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
}
return 0;
}