#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=100+5;
int dx[]={-1,1,0,0};//上下左右
int dy[]={0,0,-1,1};
int n,m;
int sr,sc;//起点
int er,ec;//终点
struct Node//BFS状态
{
int r,c;
int dist;
Node(){}
Node(int r,int c,int dist):r(r),c(c),dist(dist){}
};
int mp[maxn][maxn];//1格可行,0格为障碍
int dist[maxn][maxn];//最小距离
int BFS()
{
queue<Node> Q;
memset(dist,-1,sizeof(dist));
Q.push(Node(sr,sc,0));
dist[sr][sc]=0;
while(!Q.empty())
{
Node x=Q.front(); Q.pop();
for(int dir=0;dir<4;dir++)//向4个方向走
{
int nr=x.r+dx[dir];
int nc=x.c+dy[dir];
if(nr>=1 && nr<=n && nc>=1 && nc<=m && mp[nr][nc])//不能越过网格边界且当前格可行
{
if(dist[nr][nc]==-1 || dist[nr][nc]>dist[x.r][x.c]+1)//状态去重,等于-1是还没有走过,走过的要找最小的。
{
dist[nr][nc]=dist[x.r][x.c]+1;
Q.push(Node(nr,nc,dist[nr][nc]));
if(nr==er && nc==ec) return dist[nr][nc];//到达终点
}
}
}
}
return -1;//无法到达终点
}
int main()
{
while(scanf("%d%d",&n,&m)==2 && n && m)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&mp[i][j]);//1格可行,0格为障碍
if(mp[i][j]==2)//起点
{
mp[i][j]=1;
sr=i;
sc=j;
}
else if(mp[i][j]==3)//终点
{
mp[i][j]=1;
er=i;
ec=j;
}
}
printf("%d\n",BFS());//输出起点到终点最小距离
}
return 0;
}
bfs 起点到终点最短路
猜你喜欢
转载自blog.csdn.net/qq_40859951/article/details/84350308
今日推荐
周排行