/// <summary> /// Ищет путь в графе-лабиринте /// </summary> /// <returns>Путь по вершинам в графе</returns> /// <param name="labirynth">Лабиринт-граф</param> /// <param name="source">Вершина начала пути</param> /// <param name="destination">Вершина конца пути</param> public List <Point> FindPath(Labirynth labirynth, Point source, Point destination) { // Карта "обратных" перемещений (вершина) -> (откуда мы в нее попали) Dictionary <Point, Point> cameFrom = new Dictionary <Point, Point> (); // Стек вершин, по которым предстоит пройти // Является границей текущей карты "обратных" перемещений Stack <Point> frontier = new Stack <Point> (); // Добавляем информацию о начале cameFrom.Add(source, null); frontier.Push(source); while (frontier.Count > 0) { // Берем первую вершину в стеке Point current = frontier.Pop(); if (current == destination) { break; } // Ищем все соседние вершины List <Point> neighbours = labirynth.GetNeighbours(current); // Перемешаем соседей для драмматизма Shuffle(neighbours); foreach (Point neighbour in neighbours) { // Эту вершину мы включили в нашу карту перемещений, // значит мы смогли в нее прийти другим способом if (cameFrom.ContainsKey(neighbour)) { continue; } // Записываем что в `neighbour` мы попали из `current` cameFrom.Add(neighbour, current); frontier.Push(neighbour); } } return(BuildPath(cameFrom, source, destination)); }
public List <Point> FindPath(Labirynth labirynth, Point source, Point destination) { // Карта "обратных" перемещений (вершина) -> (откуда мы в нее попали) Dictionary <Point, Point> cameFrom = new Dictionary <Point, Point> (); // Очередь вершин, по которым предстоит пройти // Является границей текущей карты "обратных" перемещений PriorityQueue frontier = new PriorityQueue(); // Добавляем информацию о начале cameFrom[source] = null; frontier.Enqueue(source, 0f); while (!frontier.Empty()) { // Берем первую вершину в очереди Point current = frontier.Dequeue(); if (current == destination) { break; } // Ищем все соседние вершины List <Point> neighbours = labirynth.GetNeighbours(current); foreach (Point neighbour in neighbours) { if (cameFrom.ContainsKey(neighbour)) { continue; } // Записываем что в `neighbour` мы попали из `current` float priority = Heuristic(neighbour, destination); cameFrom[neighbour] = current; frontier.Enqueue(neighbour, priority); } } return(BuildPath(cameFrom, source, destination)); }