二刷提高课,题解目录在这里— 提高课的题解目录
走迷宫问题,但是增加了些难度,要求我们输出路径
我们很难记录每个点将要走到哪个点,是不是在最短路径上
但是我们可以在走迷宫的同时记录这一点是从哪个点走过来的
那么我们从终点可以逐步推出起点
但是顺序似乎不同
所以我们从终点走到起点,随后从起点再回溯到终点(完美)记住这种思想!
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010,M=N*N;
typedef pair<int ,int>PII;
PII hm[N][N],hp[M];
int g[N][N];
int n;
int dx[4]={0,1,0,-1},dy[4]={-1,0,1,0};
void bfs()
{
int hh=0,tt=0;
hp[0]={n-1,n-1};
hm[n-1][n-1]={-2,-2};
while(hh<=tt)
{
auto t=hp[hh++];
int a=t.first,b=t.second;
if(a==0&&b==0)break;
for(int i=0;i<=3;i++)
{
int a1=a+dx[i],b1=b+dy[i];
if(a1<0||a1>=n||b1<0||b1>=n)continue;
if(g[a1][b1]==1)continue;
if(hm[a1][b1].first!=-1)continue;
hm[a1][b1]={a,b};
hp[++tt]={a1,b1};
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>g[i][j];
}
memset(hm,-1,sizeof hm);
bfs();
int x=0,y=0;
for(int i=0,j=0;i!=-2;i=hm[x][y].first,j=hm[x][y].second)
{
x=i;y=j;
cout<<i<<" "<<j<<endl;
}
return 0;
}