import
java.util.*;
import
javafx.util.Pair;
public
class
Main {
static
int
nextNode(
int
x,
int
y,
int
dir,
int
N,
int
M)
{
if
(dir ==
1
)
y--;
else
if
(dir ==
2
)
y++;
else
if
(dir ==
3
)
x--;
else
x++;
if
(!(x >=
0
&& x < N && y >=
0
&& y < M))
return
-
1
;
else
return
(x * N + y);
}
static
int
dijkstra(List<Pair<Integer, Integer> >[] adj,
int
src,
int
dest,
int
N,
int
M)
{
Set<Pair<Integer, Integer> > setds
=
new
HashSet<>();
int
[] dist =
new
int
[N * M];
Arrays.fill(dist, Integer.MAX_VALUE);
setds.add(
new
Pair<>(
0
, src));
dist[src] =
0
;
while
(!setds.isEmpty())
{
Iterator<Pair<Integer, Integer> > itr
= setds.iterator();
Pair<Integer, Integer> tmp = itr.next();
setds.remove(tmp);
int
u = tmp.getValue();
Iterator<Pair<Integer, Integer> > itr2
= adj[u].iterator();
while
(itr2.hasNext()) {
Pair<Integer, Integer> p = itr2.next();
int
v = p.getKey();
int
weight = p.getValue();
if
(dist[v] > dist[u] + weight)
{
if
(dist[v] != Integer.MAX_VALUE)
setds.remove(
new
Pair<>(dist[v], v));
dist[v] = dist[u] + weight;
setds.add(
new
Pair<>(dist[v], v));
}
}
}
return
dist[dest];
}
static
int
MinModifications(
int
[][] mat)
{
int
N = mat.length, M = mat[
0
].length;
List<Pair<Integer, Integer> >[] adj
=
new
LinkedList[N * M];
for
(
int
i =
0
; i < N * M; i++)
adj[i] =
new
LinkedList<>();
for
(
int
i =
0
; i < N; i++)
{
for
(
int
j =
0
; j < M; j++)
{
for
(
int
dir =
1
; dir <=
4
; dir++)
{
int
nextNodeLabel = nextNode(i, j, dir, N, M);
if
(nextNodeLabel == -
1
)
continue
;
if
(dir == mat[i][j])
adj[i * N + j].add(
new
Pair<>(nextNodeLabel,
0
));
else
adj[i * N + j].add(
new
Pair<>(nextNodeLabel,
1
));
}
}
}
return
dijkstra(adj,
0
, (N -
1
) * N + M -
1
, N, M);
}
public
static
void
main(String[] args)
{
int
[][] mat
= { {
2
,
2
,
1
}, {
4
,
2
,
3
}, {
4
,
3
,
2
} };
System.out.println(MinModifications(mat));
}
}