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