AcWing 844. 走迷宫
原题链接
简单
作者:
Lupinus
,
2021-05-26 16:59:31
,
所有人可见
,
阅读 193
#include <cstdio>
#include <utility>
#include <queue>
#include <cstring>
using namespace std;
using PII = pair<int, int>;
const int MAXN = 101;
int g[MAXN][MAXN];
int d[MAXN][MAXN]; // 到出发点的距离
int n, m;
void bfs() {
memset(d, -1, sizeof d);
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };
queue<PII> q;
q.push(make_pair(0, 0));
d[0][0] = 0;
while (!q.empty()) {
auto pt = q.front(); q.pop(); // 从队头取!
int x = pt.first;
int y = pt.second;
// 发展
for (int i = 0; i < 4; ++i) {
int tx = dx[i] + x;
int ty = dy[i] + y;
if ((0 <= tx) && (tx < n)
&& (0 <= ty) && (ty < m)
&& (g[tx][ty] == 0)
&& (d[tx][ty] == -1)) { // 防止因为环而反复搜索;不可到达的位置,g[tx][ty]=1
d[tx][ty] = d[x][y] + 1;
q.push(make_pair(tx, ty));
}
}
}
}
int main(int argc, char const *argv[])
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
scanf("%d", &g[i][j]);
}
}
bfs();
printf("%d", d[n - 1][m - 1]);
return 0;
}