/**
#include<stdio.h>
int map[1001][1001] = {};
int v[1001][1001] = {};
int queue[2][100001];
int dx[4]={-1,+1,0,0};
int dy[4]={0,0,-1,+1};
int r = -1, f = -1;
int pi, pj, n, m;
int len=0;
int isin(int i, int j)
{
if (i < 1 || i > n || j < 1 ||j > m)
{
return 0;
}
return 1;
//내부에 있으면 1 없으면 0
}
void bfs(int i, int j)
{
int h = map[i][j];
for(int k=0;k<4;k++)
{
int ii = i+dx[k];
int jj = j+dy[k];
// 1. 범위내부 2. 방문x 3. 높이1차이이하
if(isin(ii,jj)==1 && v[ii][jj]==0 && h-1<=map[ii][jj] && map[ii][jj]<=h+1)
push(ii,jj);
}
// printf("\n");
}
void pop()
{
f ++;
pi = queue[0][f];
pj = queue[1][f];
}
void push(int i, int j)
{
v[i][j]=1;
if(i==n&&j==m) {
printf("%d",len + 1);
exit(0);
}
r++;
queue[0][r]=i;
queue[1][r]=j;
}
int main()
{
int i, j, k, mr=0;
scanf("%d %d", &n, &m);
for (i = 1 ; i <= n ; i ++)
for (j = 1 ; j <= m ; j ++)
scanf("%d", &map[i][j]);
push(1,1);
v[1][1] = 1;
while(f != r)
{
len ++;
mr = r;
for (i = f + 1 ; i <= mr ; i ++)
{
pop();
bfs(pi,pj);
}
}
printf("0");
return 0;
}
**/
#include<stdio.h>
int map[1001][1001] = {}, queue[2][100001] = {}, dx[4] = {0, +1, 0, -1}, dy[4] = {-1, 0, +1, 0};
int rear = -1, front = -1, pi, pj;
void pop()
{
front ++;
pi = queue[0][front];
pj = queue[1][front];
}
void push(int i, int j)
{
if(범위나가면) return ;
rear ++;
queue[0][rear] = i;
queue[1][rear] = j;
map[i][j]=1; //방문했다!
}
void bfs(int i, int j)
{
for (k = 0 ; k < 4 ; k ++)
{
if(map[i + dx[k]][j + dy[k]] == 0)
push(i + dx[k], j + dy[k]);
}
}
int main()
{
int i, j, k, n, m, day = 0;
scanf("%d %d", &m, &n);
for (i = 1 ; i <= n ; i ++)
{
for (j = 1 ; j <= m ; j ++)
{
scanf("%d", &map[i][j]);
}
}
while (front != rear)
{
pop();
dfs(pi, pj);
}
}