这道题,因为传送阵需要3s,所以,我们如果打普通的bfs可能会挂,于是,为了满足正确性,就可以类比01bfs之类的,搞个优先队列做。。。
但是,个人觉得有点麻烦,我们不妨从"这道题是一个搜索题"这个想法中解放出来,那么,这题就变成了一道明显的最短路问题啦!我们先利用网络图连边,然后再把传送阵的q条边添加进来就好辣!
因为有网格图,所以不建议打spfa(除非进行些玄学优化),剩下的就是dijkstra板子了!
(注意清空数组)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=301,M=300*300*4+1001;
char a[N][N];
struct node{
int v,w,nex;
}t[M];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
bool vis[N*N];int dis[N*N];
int las[N*N],len;
inline void add(int u,int v,int w){
t[++len]=(node){v,w,las[u]},las[u]=len;
}
inline void dijkstra(int st){
memset(dis,0x3f3f,sizeof(dis));
memset(vis,0,sizeof(vis));
priority_queue<pair<int,int> >sp;
dis[st]=0;sp.push(make_pair(0,st));
while(!sp.empty()){
int x=sp.top().second;sp.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=las[x];i;i=t[i].nex){
int v=t[i].v,w=t[i].w;
if(dis[v]>dis[x]+w){
dis[v]=dis[x]+w;
sp.push(make_pair(-dis[v],v));
}
}
}
}
int main(){
int n,m,q;
while(~scanf("%d%d%d",&n,&m,&q)){
memset(las,0,sizeof(las)),len=0;
int sx,sy,tx,ty;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf(" %c",&a[i][j]);
if(a[i][j]=='S'){
sx=i,sy=j;
}
if(a[i][j]=='T'){
tx=i,ty=j;
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(a[i][j]!='#'){
for(int k=0;k<4;++k){
int x=i+dx[k],y=j+dy[k];
if(x&&x<=n&&y&&y<=m&&a[x][y]!='#'){
add((i-1)*m+j,(x-1)*m+y,1);
}
}
}
}
}
for(int i=1;i<=q;++i){
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
++x1,++y1,++x2,++y2;
add((x1-1)*m+y1,(x2-1)*m+y2,3);
}
dijkstra((sx-1)*m+sy);
if(!vis[(tx-1)*m+ty]){
puts("-1");
}else{
printf("%d\n",dis[(tx-1)*m+ty]);
}
}
return 0;
} 
京公网安备 11010502036488号