code:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0;
int w=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())
if(ch=='-')
w=-1;
for(;ch>='0'&&ch<='9';ch=getchar())
s=s*10+ch-'0';
return s*w;
}
int n,m;
int x,y;
int a[1086][1086];
struct node{
int x;
int y;
int t;
};
queue<node>q;
int dx[]{0,0,1,0,-1};
int dy[]{0,1,0,-1,0};
bool vis[1086][1086];
int bfs2(int x,int y,int t){
memset(vis,0,sizeof vis);
while(!q.empty())
q.pop();
q.push({x,y,t});
while(!q.empty()){
int xx=q.front().x;
int yy=q.front().y;
int tt=q.front().t;
q.pop();
if(a[xx][yy]==3)
return tt;
for(int i=1;i<=4;i++){
if(xx+dx[i]<=0||xx+dx[i]>n||yy+dy[i]<=0||yy+dy[i]>m||vis[xx+dx[i]][yy+dy[i]]||a[xx+dx[i]][yy+dy[i]]==1)
continue;
q.push({xx+dx[i],yy+dy[i],tt+1});
vis[xx+dx[i]][yy+dy[i]]=true;
}
}
}
int bfs(int x,int y,int t){
q.push({x,y,t});
while(!q.empty()){
int xx=q.front().x;
int yy=q.front().y;
int tt=q.front().t;
q.pop();
if(a[xx][yy]==4)
return bfs2(xx,yy,tt);
for(int i=1;i<=4;i++){
if(xx+dx[i]<=0||xx+dx[i]>n||yy+dy[i]<=0||yy+dy[i]>m||vis[xx+dx[i]][yy+dy[i]]||a[xx+dx[i]][yy+dy[i]]==1)
continue;
q.push({xx+dx[i],yy+dy[i],tt+1});
vis[xx+dx[i]][yy+dy[i]]=true;
}
}
}
int main(){
m=read();
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
a[i][j]=read();
if(a[i][j]==2){
x=i;
y=j;
}
}
cout<<bfs(x,y,0);
return 0;
}
悬2关