Hdu1242 - Rescue - 广度优先搜索

来源:互联网 发布:linux下 pyqt4 找不到 编辑:程序博客网 时间:2024/06/04 18:57
#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();}}

0 0
原创粉丝点击