题解 | #走迷宫#

走迷宫

https://www.nowcoder.com/practice/e88b41dc6e764b2893bc4221777ffe64

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

int n, m;//n行m列
int xs, ys, xt, yt;//起始点和目标点
char grid[1005][1005];//网格
int dist[1005][1005];//到此结点的最短距离
int gx[4] = { 0, 0, 1, -1 };
int gy[4] = { 1, -1, 0, 0 }; //上下左右四个方向
struct node {
    int x;
    int y;
};
bool inBound(int x, int y) {
    if (x > 0 && x <= n && y > 0 && y <= m) {
        return true;
    } else {
        return false;
    }
}

int bfs(int xs, int ys, int xt, int yt) {
    queue<node> q;
    q.push({ xs, ys });
    dist[xs][ys] = 0;
    while (!q.empty()) {
        node node = q.front();
        q.pop();
        if (node.x == xt && node.y == yt) {//判断是否为目标结点
            return dist[node.x][node.y];//返回最短路径
        }
        for (int i = 0; i < 4; i++) {
            int nx = node.x + gx[i];
            int ny = node.y + gy[i];
            if (dist[nx][ny] == -1 && inBound(nx, ny) &&
                    grid[nx][ny] == '.') { //判断新的结点有没有被遍历过,且没有超过网格的边界
                dist[nx][ny] = dist[node.x][node.y] + 1;//到此结点的最短路径
                q.push({ nx, ny });
            }
        }
    }
    return -1;
}

int main() {
    cin >> n >> m;
    cin >> xs >> ys >> xt >> yt;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            cin >> grid[i][j];
        }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            dist[i][j] = -1;
        }
    if (grid[xt][yt] == '*')
        cout << -1 << endl;
    else
        cout << bfs(xs, ys, xt, yt) << endl;
    return 0;
}

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务