一、题目重述
给定n×m的二维矩阵表示探险地图,每个格子可能是:
平地('.')
障碍物('#')
起点('S')
终点('E') 求从起点到终点的最短路径步数,无法到达则输出-1。
二、完整C++实现(带详细注释)
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
char grid[N][N];
int dist[N][N]; // 距离矩阵
int n, m;
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1}; // 方向数组
int bfs(int sx, int sy, int ex, int ey) {
memset(dist, -1, sizeof dist);
queue<pair<int,int>> q;
q.push({sx, sy});
dist[sx][sy] = 0;
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
// 越界检查 || 障碍物检查 || 已访问检查
if (nx < 0 || nx >= n || ny < 0 || ny >= m
|| grid[nx][ny] == '#' || dist[nx][ny] != -1)
continue;
dist[nx][ny] = dist[x][y] + 1;
if (nx == ex && ny == ey) return dist[nx][ny];
q.push({nx, ny});
}
}
return -1;
}
int main() {
cin >> n >> m;
int sx, sy, ex, ey;
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] == 'E') ex = i, ey = j;
}
cout << bfs(sx, sy, ex, ey);
return 0;
}
三、常见错误排查
忘记初始化距离矩阵为-1
方向数组定义不全(缺少某个方向)
队列pop操作后未及时处理导致逻辑错误
边界条件未处理(如起点即终点的情况)