예제 #1
0
        /// <summary>
        /// Преобразовывает объект города в граф, где
        /// вершины - точки пересечений дорог;
        /// ребра - дороги.
        /// </summary>
        /// <param name="city">Объект с городом.</param>
        /// <returns>Граф, соответствующий указанному объекту с городом.</returns>
        public static Graph ConvertCityToGraph(City.City city)
        {
            Dictionary <Institution, Vertex> processingInstitutions = new Dictionary <Institution, Vertex>();
            Dictionary <Institution, Vertex> processedInstitutions  = new Dictionary <Institution, Vertex>();
            Graph graph = new Graph();

            foreach (var institution in city.Institutions)
            {
                AddVertex(graph, null, institution, processingInstitutions, processedInstitutions);
            }

            return(graph);
        }
예제 #2
0
        /// <summary>
        /// Осуществляет поиск кратчайшего пути до необходимого типа постройки в «городе».
        /// Если построек такого типа несколько, то возвращает путь только до той, который оказался самым кратчайшим.
        /// Если не удалось найти, то возвращает пустой путь.
        /// </summary>
        /// <param name="city">Объект с городом, поиск пути в котором необходимого выполнить.</param>
        /// <param name="startInstitution">Стартовый объект, из которой ищем путь.</param>
        /// <param name="institutionType">Тип постройки, к которой ищем путь.</param>
        /// <returns>Объект с информацией о найденном или не найденном пути.</returns>
        public static CityPathInfo FindPathTo(City.City city, Institution startInstitution,
                                              InstitutionType institutionType)
        {
            Graph  graph       = ConvertCityToGraph(city);
            Vertex startVertex = graph.Vertices.FirstOrDefault(vertex => vertex.Tag == startInstitution);

            if (startVertex == null)
            {
                throw new ArgumentException("'startInstitution' is not found in the 'city' object",
                                            nameof(startInstitution));
            }


            PathInfo     pathInfo     = FindPathTo(graph, startVertex, institutionType);
            CityPathInfo cityPathInfo = new CityPathInfo(
                pathInfo.Path.Select(vertex => vertex.Tag as Institution).ToArray(),
                pathInfo.TotalLength);

            return(cityPathInfo);
        }