迷宫的最短路径(BFS)

题目描述

给定一个大小为N*M的迷宫,由通道(’.’)和墙壁(’#’)组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(N,M<=100)

样例输入:

10 10

样例输出:

22

详细题解请看代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#define INF 10000000
using namespace std;
typedef pair<int,int> P;  //结构体状态,表示该点的坐标
int n,m;
int dp[105][105];  //表示起点到其他点的距离
char c[105][105];  //迷宫
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};   
int sx,sy,gx,gy;
int bfs()
{
    queue<P> que;//创建一个里面是结构体的队列
        //所有的位置初始化为INF
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)dp[i][j]=INF;
        //从起点开始寻找,所以将起点坐标添加到队列中
    que.push(P(sx,sy));
        //将该位置初始化为0
    dp[sx][sy]=0;
    while(que.size()){
            //从队列的最前端去除元素
        P p=que.front();
        que.pop();
            //如果取出的状态是终点,结束遍历
        if(p.first==gx && p.second == gy)break;
            //四个方向循环
        for(int i=0;i<4;i++){
                //移动之后的坐标nx,ny
            int nx=p.first+dx[i],ny=p.second+dy[i];  
                //判断是否可以移动,以及是否访问过
            if(nx>=0 && nx<n && ny>=0 && ny<m && c[nx][ny]!='#' && dp[nx][ny]==INF){
                    //如果可以访问的话,添加到队列中,并且到该位置的距离为到p的距离+1
                que.push(P(nx,ny));
                dp[nx][ny]=dp[p.first][p.second]+1;
            }
        }
    }
    return dp[gx][gy];
}
int main()
{
    scanf("%d%d",&n,&m);
    getchar();            //吸收换行符
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%c",&c[i][j]);
            if(c[i][j]=='S'){     //记录起始点
                sx=i;
                sy=j;
            }
            if(c[i][j]=='G'){    //记录终点
                gx=i;
                gy=j;
            }
        }
        getchar();      //吸收换行符
    }
    int res=bfs();
    printf("%d\n",res);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43328040/article/details/87983776