AcWing 844. 走迷宫
原题链接
简单
作者:
CarpeDime
,
2020-07-31 17:13:24
,
所有人可见
,
阅读 304
C++ 代码(数组模拟队列)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef pair<int ,int> PII;
const int N = 110;
int n, m;
int maz[N][N], d[N][N]; // maz表示的是地图, d是表示每个可以走的位置是否走过, 切所走步数。
PII q[N * N]; // 注意队列要存放整个地图所以是N * N
int hh, tt = -1;
int bfs() {
memset(d, -1, sizeof d);
d[0][0] = 0;
q[++ tt] = {0, 0};
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
while (hh <= tt) { // hh <= tt表示的是队列是否为空 q.empty();
PII t = q[hh]; // 取出队列的对头 q.front();
q[hh ++]; // 然后将队列出队 q.pop();
for (int i = 0; i < 4; ++ i) {
int x = t.first + dx[i], y = t.second + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && maz[x][y] == 0 && d[x][y] == -1) {
d[x][y] = d[t.first][t.second] + 1;
q[++ tt] = {x, y}; // 这是队列入队等价于 q.push();
}
}
}
return d[n - 1][m - 1];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++ i) {
for(int j = 0; j < m; ++ j) {
scanf("%d", &maz[i][j]);
}
}
printf("%d", bfs());
return 0;
}