http://acm.hdu.edu.cn/showproblem.php?pid=1242
题意: 天使被困在城堡里 她的朋友要去救她 路上可能会碰到守卫 碰到守卫杀掉守卫消耗1个时间 只能上下左右走 每走一步消耗时间1 求最短时间
"." 表示道路;
“x”表示守卫;
“a”表示天使;
“r”表示朋友;
“#”表示墙;
朋友可能会有多个 所以从天使出发 找到离她最近的朋友即可
代码如下:
#include <stdio.h>
#include <string.h>
char map[205][205];
int vis[205][205];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int x,y;
int n,m;
int min;
int judge(int x,int y){
if (x<0||x>=n||y<0||y>=m||map[x][y]=='#')
return 0;
return 1;
}
void dfs(int i,int j,int step){
if(map[i][j]=='r'){
if(step<min){
min=step;
}
return ;
}
for (int k=0;k<4;k++){
int x=i+dir[k][0];
int y=j+dir[k][1];
if (judge(x,y)&&!vis[x][y]){
vis[x][y]=1;
if (map[x][y]=='.')
dfs(x,y,step+1);
else if (map[x][y]=='x')
dfs(x,y,step+2);
else if (map[x][y]=='r')
dfs(x,y,step+1);
vis[x][y]=0;
}
}
}
int main (){
while (scanf ("%d%d",&n,&m)!=EOF){
getchar();
for (int i=0;i<n;i++)
scanf ("%s",map[i]);
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (map[i][j]=='a'){
x=i;
y=j;
}
}
}
min=0x3f3f3f3f;
memset(vis,0,sizeof(vis));
vis[x][y]=1;
dfs(x,y,0);
if (min==0x3f3f3f3f)
printf ("Poor ANGEL has to stay in the prison all his life.\n");
else
printf ("%d\n",min);
}
return 0;
}