AcWing844.走迷宫

题解
stl
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
const int N = 110;
queue<PII> q;
int g[N][N], n, m, d[N][N], dir[4][2] = {1,0, -1,0, 0,1, 0,-1};
void BFS()
{
int x, y;
q.push({1,1});
d[1][1] = 0;
while(q.size())
{
x = q.front().first, y = q.front().second;
q.pop();
if(x == n && y == m) break;
for(int i = 0; i < 4; ++i)
{
int xx = x + dir[i][0], yy = y + dir[i][1];
if(xx > 0 && xx <= n && yy > 0 && yy <= m && g[xx][yy] != 1 && d[xx][yy] == -1)
q.push({xx, yy}), d[xx][yy] = d[x][y] + 1;
}
}
}
int main()
{
memset(d, -1, sizeof d);
cin >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
cin >> g[i][j];
BFS();
cout << d[n][m] << endl;
return 0;
}
数组模拟队列
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 110;
int n, m;
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
bool vis[N][N];
int row[N * N], col[N * N], step[N * N], hh, tt = -1, g[N][N];
void BFS()
{
int x, y, xx, yy, s;
row[++ tt ] = 1, col[ tt ] = 1, step[tt] = 0;
while(hh <= tt)
{
x = row[hh], y = col[hh], s = step[hh ++ ];
if(x == n && y == m)
{
cout << s << endl;
return;
}
for(int i = 0 ;i < 4; ++i)
{
xx = x + dir[i][0], yy = y + dir[i][1];
if(xx > n || xx <= 0 || yy > m || yy <= 0 || g[xx][yy] == 1 || vis[xx][yy]) continue;
step[++ tt] = s + 1;
row[tt] = xx, col[tt] = yy, vis[xx][yy] = true;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
cin >> g[i][j];
BFS();
return 0;
}