0表示空地,1表示障碍物,n行m列的迷宫,最后一行为初始坐标和找寻终点坐标,求最短路径
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
#include<iostream>
using namespace std;
const int maxn=1000;
int arr[maxn][maxn];//初始化地图
int mark[maxn][maxn]={0};//用来记录已经走过的地方
struct Queue{
int x;
int y;
int step;
};
int main()
{
int next[4][2]={1,0,-1,0,0,1,0,-1};//用来表示可以行走的4种可能方向
Queue queue[501];//用队列装层层递进
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>arr[i][j];
}
}
int p,q,tx,ty,startx,starty;//分别定义终点坐标,临时移动坐标,初识坐标
cin>>startx>>starty>>p>>q;
//初始化队列头尾节点
int head=1;
int tail=1;
//走第一步
queue[tail].x=startx;
queue[tail].y=starty;
queue[tail].step=0;
tail++;
int flag=0;
//循环判断队列不为空即可一直判断
while(head<tail)
{
//开始循环遍历4个方向
for(int i=0;i<=3;i++)
{
//走任意一个方向
tx=queue[head].x+next[i][0];
ty=queue[head].y+next[i][1];
//判断是否出界
if(tx<1||tx>n||ty<1||ty>m)continue;
//判断是否已经走过,判断这个点是地图可行走点
if(mark[tx][ty]==0&&arr[tx][ty]==0)
{
//进队
queue[tail].x=tx;
queue[tail].y=ty;
queue[tail].step=queue[head].step+1;//步数一定是上一层的步数加一,上一层由头节点控制
tail++;
}
//是否是终点
if(tx==p&&ty==q)
{
flag=1;
break;
}
}
if(flag==1)
{
break;
}
//不是终点,上一层的所有子节点全部判断完,发现没有,节点出队,看下一个节点的所有子节点
head++;
}
cout<<queue[tail-1].step;
return 0;
}