using
System;
class
GFG {
static
int
[]x = {0, 1, 1, -1, 1, 0, -1, -1};
static
int
[]y = {1, 0, 1, 1, -1, -1, 0, -1};
static
int
R = 3;
static
int
C = 3;
static
int
[,]dp =
new
int
[R,C];
static
bool
isvalid(
int
i,
int
j)
{
if
(i < 0 || j < 0 || i >= R || j >= C)
return
false
;
return
true
;
}
static
bool
isadjacent(
char
prev,
char
curr)
{
return
((curr - prev) == 1);
}
static
int
getLenUtil(
char
[,]mat,
int
i,
int
j,
char
prev)
{
if
(!isvalid(i, j) || !isadjacent(prev,
mat[i,j]))
return
0;
if
(dp[i,j] != -1)
return
dp[i,j];
int
ans = 0;
for
(
int
k = 0; k < 8; k++)
ans = Math.Max(ans, 1 + getLenUtil(mat,
i + x[k], j + y[k], mat[i,j]));
return
dp[i,j] = ans;
}
static
int
getLen(
char
[,]mat,
char
s)
{
for
(
int
i = 0; i < R; ++i)
for
(
int
j = 0; j < C; ++j)
dp[i,j] = -1;
int
ans = 0;
for
(
int
i=0; i<R; i++)
{
for
(
int
j=0; j<C; j++)
{
if
(mat[i,j] == s) {
for
(
int
k = 0; k < 8; k++)
ans = Math.Max(ans, 1 +
getLenUtil(mat, i +
x[k], j + y[k], s));
}
}
}
return
ans;
}
public
static
void
Main()
{
char
[,]mat = { {
'a'
,
'c'
,
'd'
},
{
'h'
,
'b'
,
'a'
},
{
'i'
,
'g'
,
'f'
}};
Console.WriteLine(getLen(mat,
'a'
) );
Console.WriteLine(getLen(mat,
'e'
) );
Console.WriteLine(getLen(mat,
'b'
) );
Console.WriteLine(getLen(mat,
'f'
) );
}
}