-
问题描述:
小哈去玩迷宫,结果迷路了,小哼去救小哈。迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物。
问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。(注意:障碍物不能走,小哼也不能走出迷宫外,0表示空地,1表示障碍物)
输入:
5 4
0 0 1 0
0 0 0 00 0 1 00 1 0 00 0 0 11 1 4 3输出:
7
-
代码:
#include#include #define INF 10000000using namespace std;int a[50][50],b[50][50];int next[4][2]={ { 0,1},{ 1,0},{ 0,-1},{-1,0}};//四个方向struct node//用结构体模拟队列{ int x; int y; int s;//记录步数}que[2505];int main(){ int n,m,sx,sy,ex,ey,tx,ty; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); scanf("%d%d%d%d",&sx,&sy,&ex,&ey); //初始化队列 int head=1; int tail=1; //将起点入队 que[tail].x=sx; que[tail].y=sy; que[tail].s=0; tail++;//队尾指针++,队尾指针要指向空队列 b[sx][sy]=1;//标记起点 int flag=0; //开始广搜 while(head n||ty>m)//是否越界 { continue; } if(b[tx][ty]==0&&a[tx][ty]==0)//这个点没有走过并且是空地 { b[tx][ty]=1;//标记走过,此处与深搜不同,不能还原标记 //将此点入队 que[tail].x=tx; que[tail].y=ty; que[tail].s=que[head].s+1;//父亲(head)的步数加1 tail++;//队尾指针++ } if(tx==ex&&ty==ey) { flag=1; break;//走到终点 } } if(flag==1) break; head++;//四个方向可以进入路径的都以入队,将head出队 } printf("%d\n",que[tail-1].s);//输出最后一个队列元素的步数,tail指向最后一个元素的下一个位置,所以-1 return 0;}