/*
#include<stdio.h>
int main()
{
int k,n,m,i,sum=0,count,year=2023,month=1,day=1,j;
int a[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d",&k);
scanf("%d %d",&n,&m);
for(i=1;; i++)
{
if(i%2==1) sum+=n;
if(i%3==1) sum+=m;
if(sum>=k)
{
break;
}
}
day=i;
if(day<=31)
{
day--;
}
else
{
for(;;)
{
if(year%4==0) a[1]=29;
if(day>a[month-1])
{
day-=a[month-1];
month++;
}
else break;
if(month>12)
{
year++;
month=1;
}
}
}
printf("%04d/%02d/%02d",year,month,day+2);
return 0;
}
*/
/*
#include<stdio.h>
int main()
{
printf("10");
}
*/
/*
#include<stdio.h>
int main()
{
int k,n,m,d1,d2,d3,count=0;
scanf("%d",&n);
scanf("%d",&m);
scanf("%d %d %d",&d1,&d2,&d3);
k=n-m;
if(k>=d3)
{
count=count+k/d3;
k=k%d3;
if(k>=d2)
{
count+=k/d2;
k=k%d2;
if(k%d1==0)
{
count+=k/d1;
}
else
{
printf("-1");
return 0;
}
}
else
{
if(k%d1==0)
{
count+=k/d1;
}
else
{
printf("-1");
return 0;
}
}
}
else
{
if(k>=d2)
{
count+=k/d2;
k=k%d2;
if(k%d1==0)
{
count+=k/d1;
}
else
{
printf("-1");
return 0;
}
}
else
{
if(k%d1==0)
{
count+=k/d1;
}
else
{
printf("-1");
return 0;
}
}
}
printf("%d",count);
return 0;
}
*/
/*
#include<stdio.h>
int main()
{
int i,j,n,m,k,d1,d2,d3,min=-1,p,q,r,a;
scanf("%d %d",&n,&m);
scanf("%d %d %d",&d1,&d2,&d3);
k=n-m;
for(i=0;i<=k;i++)
{
for(j=0;j<=k;j++)
{
p=i*d1+j*d2;
if(p>k) break;
q=k-p;
r=q%d3;
if(r==0){
a=q/d3;
if(min==-1||(min>i+j+a)){
min=i+j+a;
}
}
}
}
printf("%d",min);
}
*/
/*
#include<stdio.h>
int main()
{
int a[4]={500,100,50,10};
int n,m,i,j,k,min=0;
scanf("%d %d",&n,&m);
k=n-m;
for(i=0;i<4;i++)
{
int b=k/a[i];
min+=b;
k-=b*a[i];
}
printf("%d",min);
return 0;
}
*/
/*
#include<stdio.h>
int main()
{
char a[100003]={};
int n,i;
scanf("%d",&n);
scanf("%s",a);
for(i=0;i<n;i++)
{
if(a[i]=='A'){
printf("U");
}
else if(a[i]=='T'){
printf("A");
}
else if(a[i]=='C'){
printf("G");
}
else if(a[i]=='G'){
printf("C");
}
}
return 0;
}
*/
/*
#include<stdio.h>
int is_yunneon(int k)
{
return (((k%4==0)&&(k%100!=0))||((k%400)==0));
}
int main()
{
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int k,n,m,day6,day,year=2023,month=1,days=1;
scanf("%d %d %d",&k,&n,&m);
k-=n+m;
day6=3*n+2*m;
day=0;
if(k>0)
{
int x=k/day6;
day+=x*6;
k-=x*day6;
if(k==0) day+=2;
else if(k<=n) day+=4;
else if(k<=n+m) day+=4;
else if(k<=2*n+m) day+=6;
else day+=8;
}
else{
day=2;
}
for(;;)
{
if(is_yunneon(year)) a[2]=29;
else a[2]=28;
if(day>=a[month]){
day-=a[month];
month++;
if(month>12){
year++;
month=1;
}
}
else break;
}
printf("%04d/%02d/%02d",year,month,day+days);
return 0;
}
*/
/*
#include<stdio.h>
int main()
{
int k,n,m,day6,day,year=2023,month=1,days=1;
scanf("%d %d %d",&k,&n,&m);
k-=n+m;
day6=3*n+2*m;
day=0;
if(k>0)
{
int x=k/day6;
day+=x*6;
k-=x*day6;
if(k==0) day+=2;
else if(k<=n) day+=4;
else if(k<=n+m) day+=4;
else if(k<=2*n+m) day+=6;
else day+=8;
}
else{
day=2;
}
if(day>=120){
month=5;
day-=120;
}
else if(day>=90){
month=4;
day-=90;
}
else if(day>=59){
month=3;
day-=59;
}
else if(day>=31){
month=2;
day-=31;
}
printf("%04d/%02d/%02d",year,month,days+day);
}
*/
#include<stdio.h>
int queue[1000000][2]={};
int dir[4][2]={{+1,0},{0,+1},{0,-1},{-1,0}};
int front=0,rear=0,pi,pj,n,m;
int ar[1001][1001]={},count[1001][1001]={},arr[1001][1001]={};
void push(int i,int j)
{
int k;
if(arr[i][j]!=0 ||i<0||j<0||i>n||j>m) return;
count[i][j]=count[pi][pj]+1;
queue[rear][0]=i;
queue[rear][1]=j;
rear++;
arr[i][j]=1;
if(rear=1000001){
for(k=front;k<rear;k++)
{
queue[k-front][0]=queue[k][0];
queue[k-front][1]=queue[k][1];
}
rear-=front;
front=0;
}
}
void pop()
{
int k;
if(front==0&&rear==0) return;
pi=queue[front][0];
pj=queue[front][1];
front++;
if(rear==1000001){
for(k=front;k<rear;k++)
{
queue[k-front][0]=queue[k][0];
queue[k-front][1]=queue[k][1];
}
rear-=front;
front=0;
}
}
int main()
{
int i,j,max=0;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&ar[i][j]);
}
}
push(0,0);
while(front!=rear)
{
pop();
for(i=0;i<4;i++)
{
if(ar[pi][pj]==ar[pi+dir[i][0]][pj+dir[i][1]]+1||ar[pi][pj]==ar[pi+dir[i][0]][pj+dir[i][1]]-1||ar[pi][pj]==ar[pi+dir[i][0]][pj+dir[i][1]]){
push(pi+dir[i][0],pj+dir[i][1]);
}
}
}
printf("%d",count[n-1][m-1]);
return 0;
}