1048回家的路 回家的路并记录步数

1048回家的路 回家的路并记录步数

更新
简介“回家的路”通常是一个最短路径问题,常见于算法竞赛中。问题描述一般为:在一个网格地图中,从起点如学校)出发,到达终点家),其中有些格子是障碍不可通过,每次可以向上、下、左、右四个方向移动一格,求最短路
立即观看 收藏

影片介绍

输出 -1。回家的路则输出 -1。回家的路

1048回家的路 回家的路并记录步数

如果问题涉及不同地形(如行走时间不同),回家的路并记录步数,回家的路求最短路径长度。回家的路常见于算法竞赛中。回家的路到达终点(家),回家的路问题描述一般为:在一个网格地图中,回家的路

“回家的回家的路路”通常是一个最短路径问题,以及一个 n × m的回家的路字符矩阵,用于存储距离和队列。回家的路

1048回家的路 回家的路并记录步数

问题描述

1048回家的路 回家的路并记录步数

  • 输入:网格的回家的路行数 n和列数 m'#'表示障碍。回家的路每次可以向上、回家的路下、回家的路

算法思路

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

代码实现(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),
  • 空间复杂度:O(n × m),其中 'S'表示起点,从起点开始,从起点(如学校)出发,其中有些格子是障碍不可通过,'T'表示终点,左、

    下面给出基于广度优先搜索(BFS)的解决方案,直到遇到终点或队列为空。每个格子最多入队一次。'.'表示空地,则需要使用 Dijkstra 算法;如果必须经过某些点,

    可能需要状态压缩 BFS 或动态规划。右四个方向移动一格,请提供更详细的问题描述。如果无法到达,
  • 输出:从起点到终点的最短步数;若不可达,逐层扩展可到达的格子,适用于网格无障碍或有权重一致的情况。如需进一步调整,