#include <stdio.h>
typedef struct
{
int x;
int y;
int h;
} q;
int i, j, k, n, m, rear = -1, front = -1, cnt = 0;
int flag = 0;
int arr[1001][1001] = {};
q queue[1000001] = {};
void push(int x, int y, int data)
{
int z = abs(data - arr[x][y]);
if (y < 1 || y > m || x < 1 || x > n || z > 1 || arr[x][y] == -1)
{
return ;
}
rear ++;
queue[rear].x = x;
queue[rear].y = y;
queue[rear].h = arr[x][y];
arr[x][y]=-1;
if (x == 1 || x == n || y == 1 || y == m) flag ++;
// printf("%d %d\n", x, y);
}
void view()
{
for (i = 1 ; i <= n ; i ++)
{
for (j = 1 ; j <= m ; j ++)
{
printf("%02d ", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
scanf("%d %d", &n, &m);
for (i = 1 ; i <= n ; i ++)
{
for (j = 1 ; j <= m ; j ++)
{
scanf("%d", &arr[i][j]);
}
}
rear ++;
queue[rear].x = 1;
queue[rear].y = 1;
queue[rear].h = arr[1][1];
arr[1][1]=-1;
while (front != rear)
{
int ooo = rear;
for (int t = front + 1 ; t <= ooo ; t ++)
{
front ++;
int nx = queue[front].x;
int ny = queue[front].y;
int nh = queue[front].h;
push(nx, ny - 1, nh);
push(nx + 1, ny, nh);
push(nx, ny + 1,nh);
push(nx - 1, ny, nh);
}
cnt ++;
///printf("rear : %d\nfront : %d\n", rear, front);
///view();
}
if (flag == 0) printf("0");
else printf("%d", cnt);
return 0;
}
/*
4 4
7 7 8 5
6 6 7 4
5 6 7 5
2 6 6 7
*/