题解 | #走迷宫#

走迷宫

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;
}

全部评论

相关推荐

我是小红是我:学校换成中南
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务