using
System;
using
System.Collections.Generic;
class
GFG
{
static
int
MAX = 26;
static
int
f(
int
x)
{
return
x -
'a'
;
}
static
int
findMinCost(String[] arr)
{
int
n = arr.Length;
int
m = arr[0].Length;
List<
int
>[] gr =
new
List<
int
>[MAX];
for
(
int
i = 0; i < MAX; i++)
gr[i] =
new
List<
int
>();
bool
[,] edge =
new
bool
[MAX, MAX];
for
(
int
k = 0; k < MAX; k++)
for
(
int
l = 0; l < MAX; l++)
edge[k,l] =
false
;
for
(
int
i = 0; i < n; i++)
for
(
int
j = 0; j < m; j++)
{
if
(i + 1 < n && !edge[f(arr[i][j]),f(arr[i + 1][j])])
{
gr[f(arr[i][j])].Add(f(arr[i + 1][j]));
edge[f(arr[i][j]), f(arr[i + 1][j])] =
true
;
}
if
(j - 1 >= 0 && !edge[f(arr[i][j]),f(arr[i][j - 1])])
{
gr[f(arr[i][j])].Add(f(arr[i][j - 1]));
edge[f(arr[i][j]), f(arr[i][j - 1])] =
true
;
}
if
(j + 1 < m && !edge[f(arr[i][j]),f(arr[i][j + 1])])
{
gr[f(arr[i][j])].Add(f(arr[i][j + 1]));
edge[f(arr[i][j]), f(arr[i][j + 1])] =
true
;
}
if
(i - 1 >= 0 && !edge[f(arr[i][j]),f(arr[i - 1][j])])
{
gr[f(arr[i][j])].Add(f(arr[i - 1][j]));
edge[f(arr[i][j]), f(arr[i - 1][j])] =
true
;
}
}
Queue<
int
> q =
new
Queue<
int
>();
q.Enqueue(arr[0][0] -
'a'
);
bool
[] v =
new
bool
[MAX];
int
d = 0;
while
(q.Count > 0)
{
int
cnt = q.Count;
while
(cnt-- > 0)
{
int
curr = q.Peek();
q.Dequeue();
if
(v[curr])
continue
;
v[curr] =
true
;
if
(curr == arr[n - 1][m - 1] -
'a'
)
return
d;
foreach
(
int
it
in
gr[curr])
q.Enqueue(it);
}
d++;
}
return
-1;
}
public
static
void
Main(String[] args)
{
String[] arr = {
"abc"
,
"def"
,
"gbi"
};
Console.Write(findMinCost(arr));
}
}