题目链接:点击这里
将走过的路变成墙,即
置成
,从而达到判重目的
输出路径:用结构体数组模拟队列,pre记录着前一个元素在队列数组中的下标,当到达终点时,往回递归回溯输出路径。
注意:BFS本身已包含最短的属性,所以只要到达了终点,那就是最短路线,输出即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010, M = N * N;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
struct node {
int x, y, pre; // pre记录前一个元素在队列数组中的下标
node() {}
node(int _x, int _y, int _p) : x(_x), y(_y), pre(_p) {}
};
int n;
int g[N][N];
int hh = 0, tt = -1; // 队首和队尾
node q[M]; // 数组模拟队列
void print(node t)
{
if(t.pre == -1)
{
printf("%d %d\n", t.x, t.y);
return;
}
print(q[t.pre]);
printf("%d %d\n", t.x, t.y);
}
void bfs()
{
q[++tt] = node(0, 0, -1);
g[0][0] = 1;
while(hh <= tt)
{
node t = q[hh]; // 取队首元素
for(int i = 0; i < 4; ++i)
{
int nx = t.x + dx[i], ny = t.y + dy[i];
if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
if(g[nx][ny] == 1) continue;
q[++tt] = node(nx, ny, hh);
g[nx][ny] = 1;
if(nx == n - 1 && ny == n - 1) return; // 到达终点
}
hh++; // 删队首元素
}
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &g[i][j]);
bfs();
print(q[tt]);
return 0;
}