http://acm.hdu.edu.cn/showproblem.php?pid=1242
#include<stdio.h>
//DFS ,再次体会对于搜索的优化,array mins[i][j],保存当前搜到
//maze[i][j]的最优值,
char maze[202][202];
int vis[202][202],mins[202][202];
int m,n,next[4][2]={1,0,0,1,-1,0,0,-1};
int x,y,xx,yy;
int best=50000,spend;
void dfs(int x,int y)
{
int t,i,a,b;
if(x==xx&&y==yy)
{
best=spend;
return ;
}
for(i=0;i<4;++i)
{
a=x+next[i][0];
b=y+next[i][1];
if(!vis[a][b]&&a>=0&&a<m&&b>=0&&b<n&&maze[a][b]!='#')
{
if(maze[a][b]=='.')
t=1;
else
t=2;
spend+=t;
if(spend<best&&(mins[a][b]==-1||spend<=mins[a][b]))
{
mins[a][b]=spend;
vis[a][b]=1;
dfs(a,b);
vis[a][b]=0;
}
spend-=t;
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&m,&n)==2)
{
spend=0;
best=50000;
for(i=0;i<m;++i)
{
scanf("%s",maze[i]);
for(j=0;j<n;++j)
{
mins[i][j]=-1;
vis[i][j]=0;
if(maze[i][j]=='r')
{
x=i;
y=j;
vis[i][j]=1;
maze[i][j]='.';
}
else if(maze[i][j]=='a')
{
xx=i;
yy=j;
maze[i][j]='.';
}
}
}
dfs(x,y);
if(best==50000)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",best);
}
return 0;
}