#include<iostream>
using namespace std;
int a[50][50], book[50][50], n, m, p, q;
//定义全局变量,二维数组a用来保存n行m列的迷宫,book数组用来标记。
//p,q为目的地坐标,min记录最小步数
void dfs(int x, int y, int step); //dfs函数用来解决当前步该怎么办
int min = 999999;
int main()
{
int i, j, startx, starty;
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &a[i][j]);
}
}
scanf("%d %d %d %d", &startx, &starty, &p, &q);
book[startx][starty] = 1;
dfs(startx, starty, 0);
printf("%d", ::min);
return 0;
}
void dfs(int x, int y, int step)
{ //定义方向数组,计算下一步的坐标
int next[4][2] = { {0, 1}, //向右
{1, 0}, //向下
{0, -1}, //向左
{-1, 0}};//向上
int tx, ty, k, r;
if(x == p && y == q) //判断此点是否已经到达目的地
{
if(step < ::min) //到达目的地,若走的步数比之前的小,则更新最小步数
{
::min = step;
}
return ;
}
else
{
for (k = 0; k < 4; k++) //没有到达目的地则从从不同方向尝试下一步
{
r = 1; //r先置为1
tx = x + next[k][0]; //tx,ty即为尝试移动后点的坐标
ty = y + next[k][1];
if (tx < 0 || tx >= n || ty < 0 || ty >= m) //判断如果越界,这次尝试不用继续下去,跳过本次循环
{
r = 0;
}
if (r) //如果没有越界
{
if (a[tx][ty] == 0 && book[tx][ty] == 0) //确定是否为障碍物或者是否该点已经走过
{
book[tx][ty] = 1; //满足条件则把该点标记
dfs(tx, ty, step + 1); //从该点开始尝试下一次
book[tx][ty] = 0; //尝试完一种后,把该点再次重置,方便下次尝试
}
}
}
}
}