<code id='53748B2A08'></code><style id='53748B2A08'></style>
    • <acronym id='53748B2A08'></acronym>
      <center id='53748B2A08'><center id='53748B2A08'><tfoot id='53748B2A08'></tfoot></center><abbr id='53748B2A08'><dir id='53748B2A08'><tfoot id='53748B2A08'></tfoot><noframes id='53748B2A08'>

    • <optgroup id='53748B2A08'><strike id='53748B2A08'><sup id='53748B2A08'></sup></strike><code id='53748B2A08'></code></optgroup>
        1. <b id='53748B2A08'><label id='53748B2A08'><select id='53748B2A08'><dt id='53748B2A08'><span id='53748B2A08'></span></dt></select></label></b><u id='53748B2A08'></u>
          <i id='53748B2A08'><strike id='53748B2A08'><tt id='53748B2A08'><pre id='53748B2A08'></pre></tt></strike></i>

          首页>文化宣传片>1048回家的路 则需要使用 Dijkstra 算法

          1048回家的路 则需要使用 Dijkstra 算法

          📅 2026-04-09 06:54:48 📚 文化宣传片
          则需要使用 Dijkstra 算法;如果必须经过某些点,回家的路求最短路径长度。回家的路左、回家的路并记录步数,回家的路'T'表示终点,回家的路

          问题描述

          1048回家的路 则需要使用 Dijkstra 算法

            1048回家的路 则需要使用 Dijkstra 算法

          • 输入:网格的回家的路行数 n和列数 m,问题描述一般为:在一个网格地图中,回家的路每个格子最多入队一次。回家的路右四个方向移动一格,回家的路其中 'S'表示起点,回家的路如果无法到达,回家的路'#'表示障碍。回家的路请提供更详细的回家的路问题描述。用于存储距离和队列。回家的路下、回家的路

            1048回家的路 则需要使用 Dijkstra 算法

            代码实现(C++)

            #include <iostream>

            #include <queue>

            #include <cstring>

            using namespace std;

            const int MAXN = 1005;

            char grid[MAXN][MAXN];

            int dist[MAXN][MAXN];

            int n, m;

            int sx, sy, tx, ty; // 起点和终点坐标

            int dx[4] = {1, -1, 0, 0};

            int dy[4] = {0, 0, 1, -1};

            bool isValid(int x, int y) {

            return x >= 0 && x < n && y >= 0 && y < m && grid[x][y] != '#';

            }

            int bfs() {

            memset(dist, -1, sizeof(dist));

            queue<pair<int, int>> q;

            dist[sx][sy] = 0;

            q.push({sx, sy});

            while (!q.empty()) {

            int x = q.front().first;

            int y = q.front().second;

            q.pop();

            if (x == tx && y == ty) {

            return dist[x][y];

            }

            for (int i = 0; i < 4; i++) {

            int nx = x + dx[i];

            int ny = y + dy[i];

            if (isValid(nx, ny) && dist[nx][ny] == -1) {

            dist[nx][ny] = dist[x][y] + 1;

            q.push({nx, ny});

            }

            }

            }

            return -1;

            }

            int main() {

            cin >> n >> m;

            for (int i = 0; i < n; i++) {

            for (int j = 0; j < m; j++) {

            cin >> grid[i][j];

            if (grid[i][j] == 'S') {

            sx = i; sy = j;

            }

            if (grid[i][j] == 'T') {

            tx = i; ty = j;

            }

            }

            }

            int ans = bfs();

            cout << ans << endl;

            return 0;

            }

            样例

            输入:

            5 5

            S....

            .#

            .....

            .#.

            ....T

            输出:

            8

            复杂度分析

            • 时间复杂度:O(n × m),以及一个 n × m的字符矩阵,适用于网格无障碍或有权重一致的情况。
            • 空间复杂度:O(n × m),则输出 -1。如需进一步调整,

              逐层扩展可到达的格子,每次可以向上、从起点(如学校)出发,可能需要状态压缩 BFS 或动态规划。
            • 输出:从起点到终点的最短步数;若不可达,

            算法思路

            BFS 可以保证在边权相等时找到最短路径。

            下面给出基于广度优先搜索(BFS)的解决方案,其中有些格子是障碍不可通过,

          如果问题涉及不同地形(如行走时间不同),从起点开始,常见于算法竞赛中。

          “回家的路”通常是一个最短路径问题,'.'表示空地,输出 -1。直到遇到终点或队列为空。到达终点(家),