题目解析
这是一道典型的在求最短路时,需要记录路径的题目,我们只需设置一个pre数组,每当遍历一个结点的时候,就记录该结点的父结点是谁,因为在BFS中,每一个结点只会被遍历一次,所以每个结点的pre数值是唯一的。
还有一个注意点,我们在输出最短路径时,是从起点开始输出,因此我们在利用BFS进行遍历时,最好是从终点向起点遍历。
代码展示
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
int n;
int g[N][N];
bool st[N][N];
PII pre[N][N];
queue<PII> q;
int dist[N][N];
void bfs()
{
while(q.size())
{
auto t = q.front();
q.pop();
int x0 = t.first, y0 = t.second;
if(x0 == 0 && y0 == 0) return;
for(int i = 0; i < 4; i ++)
{
int x = x0 + dx[i], y = y0 + dy[i];
if(x >= n || y >= n || x < 0 || y < 0) continue;
if(st[x][y] == 0 && g[x][y] == 0)
{
st[x][y] = 1;
pre[x][y] = {x0, y0};
dist[x][y] = dist[x0][y0] + 1;
q.push({x, y});
}
}
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
scanf("%d", &g[i][j]);
q.push({n - 1, n - 1});
bfs();
//cout << dist[0][0] << endl;
int x = 0, y = 0;
while(true)
{
cout << x << " " << y << endl;
int x0 = x, y0 = y;
if(x0 == n - 1 && y0 == n - 1) break;
x = pre[x0][y0].first, y = pre[x0][y0].second;
}
return 0;
}