/*
#include <stdio.h>
/**
1,3,5, 7,9,11월은 31일
2월은 29
4,6,8, 10,12월은 30일
while(3/1&&11/30)
const int amonth[13]= {12,1,2,3,4,5,6,7,8,9,10,11,12};
const int aday[13]= {31,31,28,31,30,31,30,31,31,30,31,30,31};
struct flower
{
int start_month;
int start_day;
int end_month;
int end_day;
};
struct flower plant[100000];
int main()
{
/// 0 1 2 3 4 5 6 7 8 9 10 11 12
//printf("%d",(6*31)+29+(5*30));
int i,j,n;
int start_day=1;
int start_month=3;
int big_month=3;
int big_day=1;
int count=0;
int m=1;
//printf("%d",(5*31)+28+(4*30));
scanf("%d",&n);
for(i=0; i < n; i++)
{
scanf("%d",&plant[i].start_month);
scanf("%d",&plant[i].start_day);
scanf("%d",&plant[i].end_month);
scanf("%d",&plant[i].end_day);
/*plant[i].end_day--;
if(plant[i].end_day==0)
{
plant[i].end_month=amonth[plant[i].end_month-1];
plant[i].end_day=aday[plant[i].end_month];
}
/*
if(plant[i].start_month<start_month)
{
plant[i].start_month = 3;
plant[i].start_day = 1;
}*/
/*
}
for(; m!=0;)
{
m=0;
for(i=0; i<n; i++)
{
if(plant[i].start_month<start_month)
{
//if(plant[i].start_day<=start_day)
{
if(plant[i].end_month==12)
{
printf("%d",count+1);
return 100;
}
if(plant[i].end_month>big_month)
{
big_month = plant[i].end_month;
big_day = plant[i].end_day;
m++;
}
else if(plant[i].end_month==big_month)
{
if(plant[i].end_day>big_day)
{
big_month = plant[i].end_month;
big_day = plant[i].end_day;
m++;
}
}
}
}
else if(plant[i].start_month==start_month)
{
if(plant[i].start_day<=start_day)
{
if(plant[i].end_month==12)
{
printf("%d",count+1);
return 100;
}
if(plant[i].end_month>big_month)
{
big_month = plant[i].end_month;
big_day = plant[i].end_day;
m++;
}
else if(plant[i].end_month==big_month)
{
if(plant[i].end_day>big_day)
{
big_month = plant[i].end_month;
big_day = plant[i].end_day;
m++;
}
}
}
}
}
count++;
start_day = big_day;
start_month = big_month;
}
printf("0");
}
*/
/*
#include <stdio.h>
int n;
int m;
int qx[4]= {0,0,-1,1};
int qy[4]= {-1,1,0,0};
int visited[102][102][101]= {{{0,},},};
int map[102][102]= {{0,},};
int go(int x,int y,int minx,int miny,int nopi)
{
if(visited[y+miny][x+minx][nopi]==0&&map[y+miny][x+minx]!=0)
{
return 1;
}
return 0;
}
void bfs(int x,int y,int nopi)
{
int i;
visited[y][x][nopi]=1;
if(map[y][x]<= nopi)
{
return;
}
else
{
for(i=0; i < 4; i++)
{
if(go(x,y,qx[i],qy[i],nopi)==1)
{
bfs(x+qx[i],y+qy[i],nopi);
}
}
}
}
int main()
{
int when;
int i,j,k;
int big = -1;
int count=0;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
for(j=1; j <= n; j++)
{
scanf("%d",&map[i][j]);
}
}
for(k = 3; k<=100; k++)
{
count=0;
for(i=1; i<=n; i++)
{
for(j=1; j <= n; j++)
{
if(map[i][j]>k)
{
if(go(j,i,0,0,k)==1)
{
count++;
bfs(j,i,k);
}
}
}
}
if(big <= count)
{
big = count;
when=k;
}
}
printf("%d %d",big,when);
}
*/
///4039 : 놀이공원,5024 : 공격적인 소들,3002 : 기억력 테스트 3
#include <stdio.h>
#define not 87310
int map[1002][1002]={{0,},};
int qx[4]= {0,0,-1,1};
int qy[4]= {-1,1,0,0};
int n,m;
int visted[1002][1002]={{0,},};
int f(int n)
{
if(n < 0)
{
return n*-1;
}
return n;
}
int find(int x,int y)
{
if(visted[y][x]==0&&map[y][x]!=0)
{
return 1;
}
return 0;
}
int go(int x,int y)
{
int i;
int xv;
if(x==m&&y==n)
{
return 1;
}
int n =not;
for(i =0;i <4;i++)
{
if(find(x-qx[i],y-qy[i]))
{
if(f(map[y][x]-map[y-qy[i]][x-qx[i]])==1||f(map[y][x]-map[y-qy[i]][x-qx[i]])==0)
{
xv = go(x-qx[i],y-qy[i]);
if(xv<n)
{
n=xv+1;
}
}
}
}
return n;
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}
n=go(1,1);
if(n==not)
{
printf("0");
return 0;
}
printf("%d",n);
}