#include <bits/stdc++.h>
#include <cstring>
#include <vector>
using namespace std;
class p {
public:
p() {};
p(int x1, int y1) : x(x1), y(y1) {};
int x; // 行坐标
int y; // 列坐标
};
// 上下左右四个方向(和原代码一致,无需修改)
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int bfs(p s, p d, int m, int n, vector<vector<char>>& mig) {
// 修正:初始化vis(访问标记),m行n列
vector<vector<bool>> vis(m, vector<bool>(n, false));
// 修正:初始化last(记录前驱节点,可选,此处保留原逻辑)
//vector<vector<p>> last(m, vector<p>(n, p(-1, -1)));
queue<p> q;
q.push(s);
vis[s.x][s.y] = true;
//last[s.x][s.y] = p(-1, -1);
int step = 0;
// 修正1:队列非空时才循环
while (!q.empty()) {
int size = q.size(); // 当前层的节点数量
// 遍历当前层的所有节点
for (int i = 0; i < size; i++) {
p t = q.front();
q.pop();
// 到达终点,返回当前步数
if (t.x == d.x && t.y == d.y) {
return step;
}
// 遍历四个方向
for (int j = 0; j < 4; j++) {
int nx = t.x + dx[j];
int ny = t.y + dy[j];
// 边界判断 + 可通行 + 未访问
if (nx >= 0 && nx < m && ny >= 0 && ny < n && mig[nx][ny] == '.' &&
!vis[nx][ny]) {
vis[nx][ny] = true;
//last[nx][ny] = t;
// 修正2:将新节点加入队列(原代码是q.pop(),错误)
q.push(p(nx, ny));
}
}
}
step++;
}
// 无法到达终点
return -1;
}
int main() {
int m, n; // m:行数,n:列数
cin >> m >> n; // 修正:先输入行数m,再输入列数n,避免混淆
p s, d;
cin >> s.x >> s.y; // 起点坐标(行,列)
cin >> d.x >> d.y; // 终点坐标(行,列)
s.x--;
s.y--;
d.x--;
d.y--;
vector<vector<char>> mig;
// 修正4:变量名不冲突,用row代替s
for (int i = 0; i < m; i++) {
vector<char> row;
for (int j = 0; j < n; j++) {
char t;
cin >> t;
row.push_back(t);
}
mig.push_back(row);
}
int st = bfs(s, d, m, n, mig);
cout << st << endl;
return 0;
}
太聪明了,人怎么能聪明成这样

京公网安备 11010502036488号