bfs 起点到终点最短路

#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;
}
 
 

猜你喜欢

转载自blog.csdn.net/qq_40859951/article/details/84350308