迷宫最短路径问题(BFS)

别人博客上看到的一道题:给定一个大小为N*M的迷宫,由通道(‘.’)和墙壁(‘#’)组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(N,M<=100)
原地址:http://blog.csdn.net/lrgdongnan/article/details/51773728

比较基础的迷宫题,用BFS算法即可,以下自己写的代码:
写学霸的迷宫那道题时发现二维数组[i][j]和坐标(x,y)是相反的,如果迷宫不是正方形就会出错了….数组[i][j]中i应该对应坐标y,j对应坐标x,修改了一下代码重新放上来,这次应该没问题了- -。搜索函数还是应该跟主函数独立出来的,写到一起了看着好乱-_-||

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct mig{
    int tep;
    int x,y;
    char s;
}mg[100][100];
int main()
{
    bool f[100][100];
    memset(f,0,sizeof(f));
    queue<mig> myq;
    mig tt,cc;
    int n,m,i,j,suf;                  //suf走出迷宫成功标记
    cin>>n>>m;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++){
            cin>>mg[i][j].s;
            mg[i][j].y=i;
            mg[i][j].x=j;              //注意二维数组的[i][j]与坐标(x,y)相反
            if(mg[i][j].s=='S') { mg[i][j].tep=0; f[i][j]=1; myq.push(mg[i][j]);}
            if(mg[i][j].s=='#') f[i][j]=1;
        }
    while(!myq.empty())
    {
        tt=myq.front();
        myq.pop();
        i=tt.y;
        j=tt.x;
        if(i+1<n  && f[i+1][j]==0) {
            if(mg[i+1][j].s=='G'){suf=1; break;}    //向下
            f[i+1][j]=1;
            cc.y=i+1; 
            cc.x=j;
            cc.tep=tt.tep+1; 
            myq.push(cc);
        }
        if(i-1>=0 && f[i-1][j]==0) {
            if(mg[i-1][j].s=='G'){suf=1; break;}     //向上
            f[i-1][j]=1;
            cc.y=i-1; 
            cc.x=j; 
            cc.tep=tt.tep+1; 
            myq.push(cc);
        }
        if(j+1<m  && f[i][j+1]==0) {
            if(mg[i][j+1].s=='G'){suf=1; break;}      //向右
            f[i][j+1]=1;
            cc.y=i;
            cc.x=j+1; 
            cc.tep=tt.tep+1; 
            myq.push(cc);
        }
        if(j-1>=0 && f[i][j-1]==0) {
            if(mg[i][j-1].s=='G'){suf=1; break;}      //向左
            f[i][j-1]=1;
            cc.y=i; 
            cc.x=j-1; 
            cc.tep=tt.tep+1; 
            myq.push(cc);
        }
    }
    if(suf==1) cout<<tt.tep+1<<endl;
    else cout<<"no"<<endl;
    return 0;
}
    原文作者:BFS
    原文地址: https://blog.csdn.net/specter11235/article/details/68947006
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞