BFS——迷宫问题(求最短路)

题目:

给定一个大小为 N×M 的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。

限制条件;N, M ≤ 100

Input:

《BFS——迷宫问题(求最短路)》

Output:

22

代码:

//
//  main.cpp
//  BFS(迷宫问题自己写)
//
//  Created by showlo on 2018/4/13.
//  Copyright © 2018年 showlo. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
typedef pair<int, int> P;
#define max_n 102
#define max_m 102
#define inf 1000000
int N,M;
char map[max_n][max_m];
int direct[max_n][max_m];
int sx,sy,gx,gy;
int ans;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

int bfs(int sx,int sy,int gx,int gy)
{
    int nx,ny;
    queue<P> Q;
    memset(direct, inf, sizeof(direct));
    Q.push(P(sx,sy));
    direct[sx][sy]=0;
    while (Q.size()) {
        P q=Q.front();
        Q.pop();
        if (q.first==gx&&q.second==gy)
            break;
        else{
            for (int i=0; i<=3; i++) {
                nx=q.first+dx[i];
                ny=q.second+dy[i];
                if (nx<0||nx>N||ny<0||ny>M||map[nx][ny]=='#'||direct[nx][ny]<inf)
                    continue;
                else{
                    direct[nx][ny]=direct[q.first][q.second]+1;
                    Q.push(P(nx,ny));
                }
            }
        }
    }
    return direct[gx][gy];
}
int main() {
    scanf("%d %d",&N,&M);
    for (int i=0; i<N; i++) {
        scanf("%s",map[i]);
    }
    for (int i=0; i<N; i++) {
        for (int j=0; j<M; j++) {
            if(map[i][j]=='S')
            {
                sx=i;
                sy=j;
            }
            if(map[i][j]=='G')
            {
                gx=i;
                gy=j;
            }
        }
    }
    ans=bfs(sx, sy, gx, gy);
    printf("%d\n",ans);
    return 0;
}

体会:目前感觉bfs比dfs简单一些,只需要一个while循环不停入队出队就可以了。也可能是昨天被dfs虐的太惨了(捂脸哭

    原文作者:BFS
    原文地址: https://blog.csdn.net/biongbiongdou/article/details/79936674
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞