#include<stdio.h>
#include<iostream>
#include<queue>
//点位结构体;
using namespace std;
struct point {
int x;
int y;
int step;
};
queue<point> que; //点位列队
int map[51][51],book[51][51];//地图 标记点;
int m,n,p,q;//地图大小M行N列,终点坐标P,Q;
void DFS(){
//行走方式
int next[4][2]={
{0,1},{1,0},{0,-1},{-1,0}
};
//起点入队 计入记录
book[0][0]=1;
struct point np;
np.x=0;
np.y=0;
np.step=0;
que.push(np);
while(!que.empty()){
for(int i=0;i<4;i++){
//点位+1
int nx=que.front().x+next[i][0];
int ny=que.front().y+next[i][1];
int step=que.front().step+1;
//判断边界
if(nx<0||nx>m ||ny<0||ny>n)
continue;
//判断标记
if(map[nx][ny]==0 && book[nx][ny]==0){ //判断是否走过 判断是否障碍物
book[nx][ny]=1;//标记走过
struct point np;//创建点位
np.x=nx;
np.y=ny;
np.step=step;
que.push(np);//点位入队
}
if(nx==p-1 && ny==q-1){ //到达终点 退出函数
return ;
}
}
//一个点扩展完了出队
que.pop();
}
}
int main(void){
cin>>m>>n;
cin>>p>>q;
//读入地图
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>map[i][j];
}
}
DFS();
//输入最短路径
cout<<que.back().step<<endl;
system("pause");
return 0;
}