#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N=1010, M=N*N;
int n;
int g[N][N];
PII q[M]; //模拟队列
PII pre[N][N]; //标记前驱结点
void bfs(int sx, int sy)
{
int dx[4]={-1, 0, 1, 0}, dy[4]={0, 1, 0, -1};
int hh=0, tt=0;
q[0]={sx, sy};
memset(pre, -1, sizeof pre);
pre[sx][sy]={0, 0};//起点标记一下,只要不是-1就行
while(hh<=tt)
{
PII t=q[hh++];
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) continue;
if(g[a][b]) continue;
if(pre[a][b].x !=-1) continue;
if(a==0 && b==0)
{
pre[a][b]=t;
break;
}
q[++tt]={a, b};
pre[a][b]=t;
}
}
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d", &g[i][j]);
//因为要顺着输出路径,但是原本的记录方式只能倒着输出
//所以咱们反过来,从终点到起点进行搜索
bfs(n-1, n-1);
PII end(0, 0); //终点
while(1)
{
printf("%d %d\n", end.x, end.y);
if(end.x == n-1 && end.y==n-1) break;
end=pre[end.x][end.y];
}
return 0;
}
BFS求最短路:迷宫问题 求迷宫路径 逆向思维
最新推荐文章于 2025-06-01 23:27:48 发布