#include<stdio.h>
#include<string.h>
int m,n;
char map[210][210];
int mark[210][210][2];
int to[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct point
{
int x,y,step;
int bury;//0有坑,1没坑
}queue[1000010],st,ed,now;
void bfs()
{
memset(mark,0,sizeof(mark));
int head,tail,i;
int nx,ny;
head=tail=0;
st.step=0;
st.bury=1;
queue[tail++]=st;
mark[st.x][st.y][st.bury]=1;
while(head<tail)
{
now=queue[head++];//取出队列中当前首项
if(now.bury==0)//如果有坑
{
point item=now;
item.bury=1;//坑填掉
if(mark[item.x][item.y][item.bury]==0)//如果该点没被标记过
{
mark[item.x][item.y][item.bury]=1;//标记
item.step++;//步数加一
queue[tail++]=item;//加入队列
}
continue;
}
for(i=0;i<4;i++)//如果没坑
{
nx=now.x+to[i][0];
ny=now.y+to[i][1];
point item=now;
if(nx<0||ny<0||nx>=m||ny>=n||map[nx][ny]=='#')//如果下一步超出边界或者是墙
{
continue;//跳过加入队列
}
if(nx==ed.x&&ny==ed.y)//如果结束
{
printf("%d\n",now.step+1);//输出结果步数
return ;//结束
}
int burys=1;//设置一个变量没坑
if(map[nx][ny]=='x')//如果下一个位置有坑
{
burys=0;//变量为有坑
}
if(mark[nx][ny][burys]==1)//如果下一个位置被标记过
{
continue;//跳过加入队列
}
mark[nx][ny][burys]=1;//标记下一位置
item.bury=burys;//进入下一位置
item.x=nx;//进入下一位置
item.y=ny;//进入下一位置
item.step++;//步数加一
queue[tail++]=item;//加入队列尾
}
}
puts("Poor ANGEL has to stay in the prison all his life.");
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=0;i<m;i++)
{
getchar();
for(int j=0;j<n;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='a')
{
st.x=i;
st.y=j;
}
else if(map[i][j]=='r')
{
ed.x=i;
ed.y=j;
}
}
}
bfs();
}
}
Hdu1242 - Rescue - 广度优先搜索
最新推荐文章于 2018-07-31 20:54:11 发布