#include<bits/stdc++.h>
#define P putchar
#define G getchar
using namespace std;
inline void write(int n)
{
if(n<0){
P('-');
n=-n;
}
if(n>9)
write(n/10);
P(n%10+'0');
}
inline int R(){
register int n=0,t=1;
register char c=G();
while(c<'0'||c>'9'){
if(c=='-'){
t=-1;
}
c=G();
}
while(c>='0'&&c<='9'){
n=(n<<1)+(n<<3)+(c^48);
c=G();
}
return n*t;
}
short W,h,a[1010][1010];
int cut,ans=9999999;
short aa[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
short x,y;
short d;
bool operator< (const node &m) const{
return d<m.d;
}
};
node p2,p3,p4[1000000];
queue<node> q;
map<node,short> mp1,mp2;
inline void bfs1(){
while(!q.empty()){
node w=q.front();
a[w.x][w.y]=10;
for(int i=0;i<4;i++){
int xx=w.x+aa[i][0];
int yy=w.y+aa[i][1];
if(xx<1||yy<1||xx>h||yy>W){
continue;
}
if(a[xx][yy]==0){
node p;
p.x=xx;p.y=yy;p.d=w.d+1;
q.push(p);
}
if(a[xx][yy]==4){
node p;
p.x=xx;p.y=yy;p.d=w.d+1;
mp1[p]=p.d;
p4[++cut]=p;
}
}
q.pop();
}
}
inline void bfs2(){
while(!q.empty()){
node w=q.front();
a[w.x][w.y]=1;
for(int i=0;i<4;i++){
int xx=w.x+aa[i][0];
int yy=w.y+aa[i][1];
if(xx<1||yy<1||xx>h||yy>W){
continue;
}
if(a[xx][yy]==10||a[xx][yy]==0){
node p;
p.x=xx;p.y=yy;p.d=w.d+1;
q.push(p);
}
if(a[xx][yy]==4){
node p;
p.x=xx;p.y=yy;p.d=w.d+1;
for(int i=1;i<=cut;i++){
if(p4[i].x==xx&&p4[i].y==yy){
if(mp2[p4[i]]==0){
mp2[p4[i]]=p.d;
break;
}
else{
mp2[p4[i]]=min(mp2[p4[i]],p.d);
break;
}
}
}
}
}
q.pop();
}
}
int main(){
W=R();h=R();
for(int i=1;i<=h;i++){
for(int j=1;j<=W;j++){
a[i][j]=R();
if(a[i][j]==2){
p2.x=i;
p2.y=j;
p2.d=0;
q.push(p2);
}
if(a[i][j]==3){
p3.x=i;
p3.y=j;
p3.d=0;
}
}
}
bfs1();
q.push(p3);
bfs2();
for(int i=1;i<=cut;i++){
if(mp1[p4[i]]!=0&&mp2[p4[i]]!=0){
ans=min(ans,mp1[p4[i]]+mp2[p4[i]]);
}
}
write(ans);
return 0;
}
代码如上