解题思路:本题是在迷宫问题上的加个记录路径,我们可以用一个pre数组记录一下每个点的前一个点,最后打印出来即可。这里有个小技巧,我们可以从终点开始bfs,这样的话,答案打印出来就不用翻转了
C++代码
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N = 1010;
typedef pair<int, int> PII;
PII pre[N][N];
int g[N][N], dist[N][N];
int n;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void bfs()
{
memset(dist, 0x3f, sizeof dist);
queue<PII> q;
q.push({n - 1, n - 1});
dist[n - 1][n - 1] = 0;
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i ++ )
{
int a = t.x + dx[i], b = t.y + dy[i];
if (a >= 0 && a < n && b >= 0 && b < n && g[a][b] == 0 && dist[a][b] == 0x3f3f3f3f)
{
dist[a][b] = dist[t.x][t.y] + 1;
pre[a][b] = {t.x, t.y};
q.push({a, b});
}
}
}
PII end(0, 0), start(n - 1, n - 1);
while (end != start)
{
cout << end.x << " " << end.y <<endl;
end = pre[end.x][end.y];
}
cout << start.x << " " << start.y << endl;
}
signed main()
{
cin >> n;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
{
cin >> g[i][j];
}
}
bfs();
return 0;
}
创作不易,大家可以在AcWing注册账号,参与一下AC之星计划,我的邀请码是MYRGS。对题解有任何疑问可以在评论区下面评论