原题链接:
题解:
本题因为是走迷宫(从起点到终点的最短路径),且无边权,因此更适合用bfs逐层求解。
图片转载自AcWing 844. 走迷宫:图解+代码注释 - AcWing
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
int n, m;
int g[N][N], d[N][N];//g用于存储迷宫,d用于存储迷宫各点距迷宫起点的距离
queue<pair<int,int>> q;//存储当前遍历到的结点
int bfs() {
memset(d, -1, sizeof(d));//初始化为-1,表示这个点未曾访问过
d[1][1] = 0;//起点距起点的距离为0
q.push({ 1,1 });//存入起点
int dx[] = { 0,0,-1,1 }, dy[] = { -1,1,0,0 };//上下左右四种移动操作
while (q.size()) {
auto f = q.front();
q.pop();
for (int i = 0;i < 4;i++) {
int x = f.first + dx[i], y = f.second + dy[i];
if (x >= 1 && x <= n && y >= 1 && y <= m && g[x][y] == 0 && d[x][y] == -1) {
d[x][y] = d[f.first][f.second] + 1;
q.push({ x,y });
}
}
}
return d[n][m];
}
int main() {
cin >> n >> m;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
cin >> g[i][j];
cout << bfs();
}