using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG {
static
class
Globals {
public
static
int
row = 5;
public
static
int
col = 5;
public
static
int
[, ] minDistance
=
new
int
[row + 1, col + 1];
public
static
int
[, ] visited
=
new
int
[row + 1, col + 1];
public
static
Queue<KeyValuePair<
int
,
int
> > que
=
new
Queue<KeyValuePair<
int
,
int
> >();
}
static
bool
isValid(
int
[, ] grid,
int
i,
int
j)
{
if
(i < 0 || j < 0 || j >= Globals.col
|| i >= Globals.row || grid[i, j] != 0
|| Globals.visited[i, j] != 0)
return
false
;
return
true
;
}
static
int
minDistance1(
int
[, ] grid,
int
sourceRow,
int
sourceCol)
{
if
((sourceCol == 0 && sourceRow == 0)
|| (sourceCol == Globals.col - 1
&& sourceRow == 0)
|| (sourceCol == 0
&& sourceRow == Globals.row - 1)
|| (sourceCol == Globals.col - 1
&& sourceRow == Globals.row - 1))
return
0;
int
minFromSource = Globals.row * Globals.col;
for
(
int
i = 0; i < Globals.row; i++)
for
(
int
j = 0; j < Globals.col; j++)
Globals.minDistance[i, j]
= Globals.row * Globals.col;
Globals.que.Enqueue(
new
KeyValuePair<
int
,
int
>(
sourceRow, sourceCol));
Globals.minDistance[sourceRow, sourceCol] = 0;
Globals.visited[sourceRow, sourceCol] = 1;
while
(Globals.que.Count > 0) {
KeyValuePair<
int
,
int
> cell
= Globals.que.Dequeue();
int
cellRow = cell.Key;
int
cellCol = cell.Value;
if
(isValid(grid, cellRow + 1, cellCol)) {
Globals.que.Enqueue(
new
KeyValuePair<
int
,
int
>(cellRow + 1,
cellCol));
Globals.minDistance[cellRow + 1, cellCol]
= Math.Min(
Globals.minDistance[cellRow + 1,
cellCol],
Globals.minDistance[cellRow,
cellCol]
+ 1);
Globals.visited[cellRow + 1, cellCol] = 1;
}
if
(isValid(grid, cellRow - 1, cellCol)) {
Globals.que.Enqueue(
new
KeyValuePair<
int
,
int
>(cellRow - 1,
cellCol));
Globals.minDistance[cellRow - 1, cellCol]
= Math.Min(
Globals.minDistance[cellRow - 1,
cellCol],
Globals.minDistance[cellRow,
cellCol]
+ 1);
Globals.visited[cellRow - 1, cellCol] = 1;
}
if
(isValid(grid, cellRow, cellCol + 1)) {
Globals.que.Enqueue(
new
KeyValuePair<
int
,
int
>(
cellRow, cellCol + 1));
Globals.minDistance[cellRow, cellCol + 1]
= Math.Min(
Globals.minDistance[cellRow,
cellCol + 1],
Globals.minDistance[cellRow,
cellCol]
+ 1);
Globals.visited[cellRow, cellCol + 1] = 1;
}
if
(isValid(grid, cellRow, cellCol - 1)) {
Globals.que.Enqueue(
new
KeyValuePair<
int
,
int
>(
cellRow, cellCol - 1));
Globals.minDistance[cellRow, cellCol - 1]
= Math.Min(
Globals.minDistance[cellRow,
cellCol - 1],
Globals.minDistance[cellRow,
cellCol]
+ 1);
Globals.visited[cellRow, cellCol - 1] = 1;
}
}
minFromSource = Math.Min(minFromSource,
Globals.minDistance[0, 0]);
minFromSource = Math.Min(
minFromSource,
Globals.minDistance[Globals.row - 1, 0]);
minFromSource = Math.Min(
minFromSource,
Globals.minDistance[Globals.row - 1,
Globals.col - 1]);
minFromSource = Math.Min(
minFromSource,
Globals.minDistance[0, Globals.col - 1]);
if
(minFromSource == Globals.row * Globals.col)
return
-1;
return
minFromSource;
}
static
void
Main()
{
int
sourceRow = 3, sourceCol = 3;
int
[, ] grid = { { 1, 1, 1, 0, 0 },
{ 0, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1 },
{ 1, 1, 0, 1, 0 } };
Console.WriteLine(
minDistance1(grid, sourceRow, sourceCol));
}
}