using
System;
public
class
GFG {
static
int
m, n;
public
static
bool
isValid(
int
i,
int
j,
int
x,
bool
[, ] visited,
int
[, ] arr,
int
parent)
{
if
((i < 0) || (j < 0) || (i >= m) || (j >= n)
|| (visited[i, j] ==
true
)
|| (Math.Abs(arr[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, arr, arr[i, j]))
return
true
;
if
(isValid(i - 1, j, x, visited, arr, arr[i, j]))
return
true
;
if
(isValid(i, j + 1, x, visited, arr, arr[i, j]))
return
true
;
if
(isValid(i, j - 1, x, visited, arr, arr[i, j]))
return
true
;
return
false
;
}
public
static
int
minimumEnergyPath(
int
[, ] arr)
{
int
start = 0, end = 10000000;
int
result = arr[0, 0];
while
(start <= end) {
int
mid = (
int
)((start + end) / 2);
bool
[, ] visited =
new
bool
[m, n];
for
(
int
i = 0; i < m; i++) {
for
(
int
j = 0; j < n; j++) {
visited[i, j] =
false
;
}
}
if
(isValid(0, 0, mid, visited, arr, arr[0, 0])
==
true
) {
result = mid;
end = mid - 1;
}
else
{
start = mid + 1;
}
}
return
result;
}
static
public
void
Main()
{
int
[, ] arr = {
{ 1, 2, 1 },
{ 2, 8, 2 },
{ 2, 4, 2 },
};
m = arr.GetLength(0);
n = arr.GetLength(1);
Console.WriteLine(minimumEnergyPath(arr));
}
}