bfs算法1.1(模板+剪枝)

给定一个迷宫,2代表起点,3代表终端,0不可走,1可走,若有最短距离输出起点到终点最短距离;

#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 sr,sc,er,ec;
int n,m;
struct Node{
    int r,c,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 i=0;i<4;i++){
            int nr=x.r+dx[i];
            int nc=x.c+dy[i];
             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)//状态去重
                {
                    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/lanshan1111/article/details/83042680