要在元素入队列的时候就将其st标记为true,
而不是等到出队时才标记为true;
如果在出队时才标记为true,队列里可能会有很多重复元素,可能会导致空间不够爆掉。
acwing.844 走迷宫
#include <iostream>
#include <cstring>
using namespace std;
const int N = 200;
typedef pair<int, int> PII;
PII q[N * N];
int hh = 0, tt = -1;
int g[N][N];
int d[N][N];
bool st[N][N];
int n, m;
int offx[4] = {1, -1, 0, 0}, offy[4] = {0, 0, 1, -1};
int bfs() {
q[++ tt] = {1, 1};
st[1][1] = true; //在这里!入队就标记为true
while(hh <= tt) {
auto t = q[hh ++];
int x = t.first, y = t.second;
for(int i = 0; i < 4; i ++) {
int a = x + offx[i], b = y + offy[i];
if(a < 1 || a > n || b < 1 || b > m || g[a][b] == 1 || st[a][b]) continue;
q[++ tt] = {a, b};
d[a][b] = d[x][y] + 1;
st[a][b] = true; //在这里!入队就标记为true
}
}
return d[n][m];
}
int main() {
memset(st, 0, sizeof st);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &g[i][j]);
cout << bfs() << endl;
return 0;
}