示例#1
0
    /// <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));
    }
示例#2
0
    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));
    }