杭电 1242题(深度优先搜索)
//此题应该从后往前搜,因为营救者不止一人
#include<stdio.h>
#include<string.h>
int d[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; //设置搜索的4个方向
int m,n,si,sj,sti,stj,flag;
int min;
char map[202][202];
int len[202][202];
void dfs(int a,int b,int t) //传递过来的是Angel的位置
{
int i;
if(a<0||a>=m||b<0||b>=n||t>=min) //如果搜索到这里时间已经比min大了,则不必向下搜索
return;
if(a==si&&b==sj)
{
if(t<min) min=t;
flag=1;
return;
}
if(len[a][b]<=t)
return;
if(len[a][b]>t)
len[a][b]=t; //和做1180的题目一样。。一点没变
for(i=0;i<4;i++)
{
if(map[a+d[i][0]][b+d[i][1]]=='.'||map[a+d[i][0]][b+d[i][1]]=='r')
{
map[a+d[i][0]][b+d[i][1]]='#';
dfs(a+d[i][0],b+d[i][1],t+1);
map[a+d[i][0]][b+d[i][1]]='.';
}
if(map[a+d[i][0]][b+d[i][1]]=='x')
{
map[a+d[i][0]][b+d[i][1]]='#';
dfs(a+d[i][0],b+d[i][1],t+2);
map[a+d[i][0]][b+d[i][1]]='x';
}
}
}
void main()
{
int i,j;
while(scanf("%d%d",&m,&n)==2)
{
if(m==0||n==0)
{
printf("0\n");
}
flag=0;
for(i=0;i<202;i++)
for(j=0;j<202;j++)
len[i][j]=100000;
for(i=0;i<m;i++)
{
getchar();
for(j=0;j<n;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='a') //Angel所在的位置
{
sti=i;
stj=j;
}
if(map[i][j]=='r') //朋友所在的位置
{
si=i;
sj=j;
}
}
}
min=100000;
map[sti][stj]='#';
dfs(sti,stj,0); //将Angel所在的位置传递过去
if(flag==1)
printf("%d\n",min);
if(flag==0)
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
}