救援启动!
原原老师在一座城市中迷路了。这座城市是一片巨大的迷宫,由n×m的格子组成,每个格子对应迷宫中的一个位置,但城市中有些地方已经变成障碍,任何人只能上下左右移动一格,而障碍则无法通过。
原原老师被困在(sx,sy),她计划到警察局求助,警察局在(px,py)处。但是原原老师不知道的是,警察局已经搬走了!
然而,事情出现了转机!赵老师得知消息后,马上从(tx,ty)处出发赶往救援。赵老师知道原原老师会选择一条最短路径前往警察局。为了成功营救,赵老师计划找到一条最短路径,赶到原原老师即将经过的路径中的任意一点等着她。由于赵老师先出发,因此保证可以在原原老师到达某个位置前赶到这个位置。
在这场营救行动中,“最短路径”有一个特别的定义:原原老师和赵老师会将每一步的移动方向编码成一个数字序列,上代表 1,右代表 2,下代表 3,左代表 4。例如,如果行走方向是上(1)→左(4)→下(3)→右(2),那么路径的编码为1432。在所有可能的路径中,编码数字最小的路径才被视为最短路径。
你能帮助赵老师计算出他最少需要走多少步,才能成功在原原老师的行走路径中截住她?
输入描述
输入共n+1行。
第一行包含八个正整数n,m,sx,sy,tx,ty,px,py。保证原原老师被困位置、城市入口、警察局所处位置互不相同。
接下来共n行,每行m个整数,用来描述城市的俯视图。其中第i行的第j个数表示(i,j)是否被设置障碍,有用 1 表示,没有用 0 表示。
输出描述
输出共一行,表示赵老师最少需要走的步数。
若原原老师没有到达警察局的可行路径,或赵老师没有到达原原老师行走的路径中的任意一点的可行路径,则输出 −1。
步骤:1.利用BFS跑出从(sx,sy)到(px,py)的最短路;
2.通过前驱标记最短路;
3.从(tx,ty)开始跑图,若跑到的点被标记,则返回步数。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,fx,fy,px,py,a[1010][1010],vis[1010][1010],dir[4][2]={-1,0,0,1,1,0,0,-1},len=1,f,ans=0x3f3f3f;
int ans1[1010][1010];
struct node{int x,y,st;
}q[4000010];
struct node1{int x,y;
}p[1010][1010];
int bfs2(){int hh=0,tt=0;q[tt++]={fx,fy,0};vis[fx][fy]=1;while(hh<tt){node t=q[hh++];if(ans1[t.x][t.y]==1)return t.st;for(int i=0;i<4;i++){int tx=t.x+dir[i][0];int ty=t.y+dir[i][1];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&!a[tx][ty]){vis[tx][ty]=1;q[tt++]={tx,ty,t.st+1};}}}return -1;
}
void bfs1(){int hh=0,tt=0;q[tt++]={sx,sy,0};p[sx][sy]={sx,sy};vis[sx][sy]=1;while(hh<tt){node t=q[hh++];if(t.x==px&&t.y==py){f=1;break;}for(int i=0;i<4;i++){int tx=t.x+dir[i][0];int ty=t.y+dir[i][1];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&!a[tx][ty]){p[tx][ty]={t.x,t.y};vis[tx][ty]=1;q[tt++]={tx,ty,t.st+1};}}}if(f){ans1[px][py]=1;int xx=px,yy=py;while(xx!=sx||yy!=sy){//cout<<xx<<" "<<yy<<" "<<bfs2(xx,yy)<<" "<<ans<<" "<<endl;ans1[p[xx][yy].x][p[xx][yy].y]=1;int nx=p[xx][yy].x;int ny=p[xx][yy].y;xx=nx,yy=ny;ans1[xx][yy]=1;}ans1[sx][sy]=1;}return;
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m>>sx>>sy>>fx>>fy>>px>>py;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}} bfs1();memset(vis,0,sizeof(vis));ans=bfs2();cout<<ans;
}