7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........Sample Output
13
被困的天使——a,#——围墙,r——天使的朋友,.——可以走的路,x——守卫。算出r救出a的最短时间。如果遇到守卫天数+1.
BFS的思路就是找出天使离最近的朋友的最短距离。(因为天使的朋友不一定是一个,所以要从天使的位置开始找最近的朋友的距离),设置一个全局变量ans,赋值最大值200*200=40000,当步数>=最大值的时候就跳出循环,其实也相当于一个剪枝了。
BFS代码
#include
#include
#include
using namespace std;
int n,m,ans,ax,ay;
bool flag;
char prison[201][201];
int vis[201][201];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int step)
{
int i,x1,y1;
if(step>=ans)
return;
if(prison[x][y]=='r')
{
flag=1;
if(step=1&&x1<=n&&y1>=1&&y1<=m&&prison[x1][y1]!='#'&&vis[x1][y1]==0)
{
if(prison[x][y]=='x')
step++;
vis[x1][y1]=1;
dfs(x1,y1,step+1);
vis[x1][y1]=0;
if(prison[x][y]=='x')
step--;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
memset(vis,0,sizeof(vis));
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>prison[i][j];
if(prison[i][j]=='a')
{
ax=i;
ay=j;
}
}
}
flag=0;
ans=40000;
vis[ax][ay]=1;
dfs(ax,ay,0);
if(flag)
printf("%d\n",ans);
else
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
return 0;
}