private static LabyrinthPosition GenerateRandomEntryPoint(string[][] labyrinth)
        {
            var entryPoint = new LabyrinthPosition(
                RandomGen.Next(0, labyrinth.Length - 1), 
                RandomGen.Next(0, labyrinth[0].Length - 1));

            labyrinth[entryPoint.Row][entryPoint.Col] = EntryPointToken;
            return entryPoint;
        }
        private static void TraverseLabyrinth(IList<string[]> labyrinth, LabyrinthPosition labyrinthPosition, int steps)
        {
            if (OutsideTheBoundsOfTheLabyrinth(labyrinth, labyrinthPosition))
            {
                return;
            }

            var currentCell = labyrinth[labyrinthPosition.Row][labyrinthPosition.Col];

            if (currentCell == Wall)
            {
                return;
            }

            if (currentCell != EntryPointToken)
            {
                if (currentCell == EmptyCell || int.Parse(currentCell) > steps)
                {
                    labyrinth[labyrinthPosition.Row][labyrinthPosition.Col] =
                        steps.ToString(CultureInfo.InvariantCulture);
                }
                else
                {
                    return;
                }
            }

            // go left
            TraverseLabyrinth(labyrinth, new LabyrinthPosition(labyrinthPosition.Row, labyrinthPosition.Col - 1), steps + 1);

            // go right
            TraverseLabyrinth(labyrinth, new LabyrinthPosition(labyrinthPosition.Row, labyrinthPosition.Col + 1), steps + 1);

            // go up 
            TraverseLabyrinth(labyrinth, new LabyrinthPosition(labyrinthPosition.Row - 1, labyrinthPosition.Col), steps + 1);

            // go down
            TraverseLabyrinth(labyrinth, new LabyrinthPosition(labyrinthPosition.Row + 1, labyrinthPosition.Col), steps + 1);
        }
        private static bool OutsideTheBoundsOfTheLabyrinth(IList<string[]> labyrinth, LabyrinthPosition labyrinthPosition)
        {
            var rowOutOfBounds = labyrinthPosition.Row < 0 || labyrinthPosition.Row >= labyrinth.Count;
            var colOutOfBounds = labyrinthPosition.Col < 0 || labyrinthPosition.Col >= labyrinth[0].Length;

            return rowOutOfBounds || colOutOfBounds;
        }