public Maze(MazeCell[,] mazeCells, MazeCell startCell, MazeCell exitCell)
 {
     MazeCells         = mazeCells ?? throw new ArgumentNullException(nameof(mazeCells));
     StartCellPosition = startCell;
     ExitCellPosition  = exitCell;
 }
 /// <summary>
 /// Возвращает путь между двумя точками в лабиринте
 /// </summary>
 /// <param name="source">Начальная точка пути в лабиринте</param>
 /// <param name="destination">Конечная точка пути в лабиринте</param>
 /// <param name="token"></param>
 /// <returns>Список координат точек между начальной и конечной точкой лабиринта</returns>
 public List <MazeCell> GetCellsPath(MazeCell source, MazeCell destination)
 {
     return(Chain.Traverse(CreateChainTree(source, destination, CancellationToken.None)));
 }
 public Chain(MazeCell current, Chain prev = null)
 {
     CurrentCell   = current;
     PreviousChain = prev;
 }
 /// <summary>
 /// Асинхронно возвращает путь между двумя точками в лабиринте и поддерживает отмену операции
 /// </summary>
 /// <param name="source">Начальная точка пути в лабиринте</param>
 /// <param name="destination">Конечная точка пути в лабиринте</param>
 /// <param name="token">Объект <see cref="CancellationToken"/> для отмены операции.</param>
 /// <returns>Список координат точек между начальной и конечной точкой лабиринта</returns>
 private List <MazeCell> GetCellsPathAsync(MazeCell source, MazeCell destination, CancellationToken token)
 {
     return(Chain.Traverse(CreateChainTree(source, destination, token)));
 }
 /// <summary>
 /// Асинхронно возвращает путь между двумя точками в лабиринте
 /// </summary>
 /// <param name="source">Начальная точка пути в лабиринте</param>
 /// <param name="destination">Конечная точка пути в лабиринте</param>
 /// <param name="token">Объект <see cref="CancellationToken"/> для отмены операции.</param>
 /// <returns>Список координат точек между начальной и конечной точкой лабиринта</returns>
 public Task <List <MazeCell> > GetCellsPathTaskAsync(MazeCell source, MazeCell destination, CancellationToken token)
 {
     return(Task.Run(() => GetCellsPathAsync(source, destination, token), token));
 }