using
System;
class
Program
{
static
int
ShortestXYDist(
char
[][] grid,
int
N,
int
M)
{
int
[,] dist =
new
int
[N, M];
for
(
int
i = 0; i < N; i++)
{
for
(
int
j = 0; j < M; j++)
{
dist[i, j] =
int
.MaxValue;
}
}
for
(
int
i = 0; i < N; i++)
{
for
(
int
j = 0; j < M; j++)
{
if
(grid[i][j] ==
'X'
)
{
dist[i, j] = 0;
}
else
{
if
(i > 0)
{
dist[i, j] = Math.Min(dist[i, j], dist[i - 1, j] + 1);
}
if
(j > 0)
{
dist[i, j] = Math.Min(dist[i, j], dist[i, j - 1] + 1);
}
}
}
}
for
(
int
i = N - 1; i >= 0; i--)
{
for
(
int
j = M - 1; j >= 0; j--)
{
if
(grid[i][j] ==
'X'
)
{
dist[i, j] = 0;
}
else
{
if
(i < N - 1)
{
dist[i, j] = Math.Min(dist[i, j], dist[i + 1, j] + 1);
}
if
(j < M - 1)
{
dist[i, j] = Math.Min(dist[i, j], dist[i, j + 1] + 1);
}
}
}
}
int
ans =
int
.MaxValue;
for
(
int
i = 0; i < N; i++)
{
for
(
int
j = 0; j < M; j++)
{
if
(grid[i][j] ==
'Y'
)
{
ans = Math.Min(ans, dist[i, j]);
}
}
}
return
ans ==
int
.MaxValue ? -1 : ans;
}
static
void
Main()
{
int
N = 4;
int
M = 4;
char
[][] grid =
new
char
[][]
{
new
char
[] {
'X'
,
'O'
,
'O'
,
'O'
},
new
char
[] {
'O'
,
'Y'
,
'O'
,
'Y'
},
new
char
[] {
'X'
,
'X'
,
'O'
,
'O'
},
new
char
[] {
'O'
,
'Y'
,
'O'
,
'O'
}
};
int
minDistance = ShortestXYDist(grid, N, M);
Console.WriteLine(
"Minimum distance from 'X' to 'Y': "
+
(minDistance == -1 ?
"Not reachable"
: minDistance.ToString()));
}
}