using
System;
using
System.Collections.Generic;
public
class
GFG {
static
int
M, N;
static
bool
IsValid(
int
i,
int
j,
int
x,
bool
[, ] visited,
List<List<
int
> > grid,
long
parent)
{
if
(i < 0 || j < 0 || i >= M || j >= N
|| visited[i, j]
|| Math.Abs(grid[i][j] - parent) > x)
return
false
;
if
(i == M - 1 && j == N - 1)
return
true
;
visited[i, j] =
true
;
if
(IsValid(i + 1, j, x, visited, grid, grid[i][j]))
return
true
;
if
(IsValid(i - 1, j, x, visited, grid, grid[i][j]))
return
true
;
if
(IsValid(i, j + 1, x, visited, grid, grid[i][j]))
return
true
;
if
(IsValid(i, j - 1, x, visited, grid, grid[i][j]))
return
true
;
return
false
;
}
static
int
OptimalPath(List<List<
int
> > grid)
{
int
low = 0, high = 10000000;
int
result = grid[0][0];
while
(low <= high) {
int
mid = (low + high) / 2;
bool
[, ] visited =
new
bool
[M, N];
if
(IsValid(0, 0, mid, visited, grid,
grid[0][0])) {
result = mid;
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return
result;
}
public
static
void
Main(
string
[] args)
{
List<List<
int
> > grid =
new
List<List<
int
> >{
new
List<
int
>{ 1, 2, 1 },
new
List<
int
>{ 2, 8, 2 },
new
List<
int
>{ 2, 4, 2 }
};
M = grid.Count;
N = grid[0].Count;
Console.WriteLine(OptimalPath(grid));
}
}