static private void GetStartData() { try { /* Считать данные с консоли*/ Console.WriteLine("Введите название города отправления"); dispatchCity = Console.ReadLine(); Console.WriteLine("Введите название города прибытия"); arrivalCity = Console.ReadLine(); Console.WriteLine("Введите день отправления цифрой"); departureDay = default; bool parseStatus = Enum.TryParse(Console.ReadLine(), out departureDay); Console.WriteLine("Введите время отправления"); departureTime = TimeSpan.Parse(Console.ReadLine()); } catch (Exception e) { Console.WriteLine($"Допущена ошибка: {e.Message}"); Console.WriteLine("Введите данные повторно"); GetStartData(); } }
private static void GoToNextDay(ref DepartureDay nearestFlightDay, ref int daysUntilFlight) { /* * Добавить день недели и увеличить количество дней в пути на 1 */ nearestFlightDay = Next(nearestFlightDay); ++daysUntilFlight; }
static private void BuildWaysFromNode(string dispatchCity, DepartureDay departureDay, TimeSpan departureTime) { /* * Получить город в который попали * Пометить как посещённый * Получить все связанные города * Для каждого найти лучший рейс * Для каждого города проверить лучше ли новый путь чем прошлые * Если лучше, то: * Записать Новое лучшее время пути для данного города * Записать путь по которому это время достигается * После проверки каждого города удалить маршруты соеденяюющие города из графа (Для облегчения графа) * Запустить рекурсию для непосещённых городов */ var currentNode = Graph.Nodes.Find(node => node.Name == dispatchCity); currentNode.IsChecked = true; var flightsFromNode = Graph.Flights.FindAll(route => route.DispatchCity == dispatchCity); foreach (var route in flightsFromNode) { var bestFlight = FindBestFlight(route.Flights, departureDay, departureTime); var arrivalNode = Graph.Nodes.Find(node => node.Name == route.ArrivalCity); if (arrivalNode.TimeOfRoute > currentNode.TimeOfRoute + bestFlight.FlightTime) { /*Костыль с поиском дня следующего вылета*/ var timeUntilFlight = bestFlight.FlightTime - TakeTimeInAir(bestFlight.Flight.DepartureTime, bestFlight.Flight.ArrivalTime); var timeOfDeparture = departureTime + timeUntilFlight; var nextDepartureDay = departureDay; for (var i = 0; i < timeOfDeparture.Days; i++) { nextDepartureDay = Next(nextDepartureDay); } /*--------------------------------------------*/ arrivalNode.TimeOfRoute = currentNode.TimeOfRoute + bestFlight.FlightTime; arrivalNode.RouteToTheNode = new List <GraphFlight>(currentNode.RouteToTheNode); arrivalNode.RouteToTheNode.Add(new GraphFlight(bestFlight.Flight, route, nextDepartureDay, bestFlight.FlightTime)); } Graph.Flights.RemoveAll(flights => flights.DispatchCity == currentNode.Name && flights.ArrivalCity == route.ArrivalCity); Graph.Flights.RemoveAll(flights => flights.DispatchCity == route.ArrivalCity && flights.ArrivalCity == currentNode.Name); } var nextNode = TakeNodeWithMinTimeOfRoute(); if (nextNode != null) { var previousNode = nextNode.RouteToTheNode[nextNode.RouteToTheNode.Count - 1]; var departureDate = TakeArrivalDate(previousNode, (DepartureDay)previousNode.DepartureDay); BuildWaysFromNode(nextNode.Name, departureDate.arrivalDay, departureDate.arrivalTime); } }
public GraphFlight(FlightModel flight, RouteModel route, DepartureDay departureDay, TimeSpan flightTime) { DispatchCity = route.DispatchCity; ArrivalCity = route.ArrivalCity; DepartureDay = departureDay; FlightTime = flightTime; FlightNumber = flight.FlightNumber; DepartureTime = flight.DepartureTime; ArrivalTime = flight.ArrivalTime; }
public static (DepartureDay arrivalDay, TimeSpan arrivalTime) TakeArrivalDate(GraphFlight flight, DepartureDay departureDay) { /* * На основании дня вылета и рейса определить день прибытия */ var time = flight.DepartureTime + TakeTimeInAir(flight.DepartureTime, flight.ArrivalTime); if (time.Days > 0) { departureDay = Next(departureDay); time -= new TimeSpan(time.Days, 0, 0, 0); } return(departureDay, time); }
private static TimeSpan TimeUntilEndOfFlight(FlightModel flight, DepartureDay dayOfDeparture, TimeSpan timeOfDeparture) { /* * Найти ближайший день вылета * Посчить время оставшие до вылета * Посчитать время в полёте * Вернуть общее время до прибытия в пункт назначения */ int daysUntilFlight = default; DepartureDay nearestFlightDay = dayOfDeparture; if (timeOfDeparture >= flight.DepartureTime) { GoToNextDay(ref nearestFlightDay, ref daysUntilFlight); } while (!flight.DeparturesDays.Contains(nearestFlightDay)) { GoToNextDay(ref nearestFlightDay, ref daysUntilFlight); } return(new TimeSpan(daysUntilFlight, 0, 0, 0) + (flight.DepartureTime - timeOfDeparture) + TakeTimeInAir(flight.DepartureTime, flight.ArrivalTime)); }
public static void PrintStartInfo(string dispatchCity, string arrivalCity, DepartureDay departureDay, TimeSpan departureTime) { /* Вывести стартовые данные введёные пользователем*/ Console.WriteLine($"Рассчёт пути из {dispatchCity} до {arrivalCity}!"); Console.WriteLine($"Дань возможного вылета: {departureDay}, время возможного вылета: {departureTime}!"); }
public static (FlightModel Flight, TimeSpan FlightTime) FindBestFlight(List <FlightModel> flights, DepartureDay dayOfDeparture, TimeSpan timeOfDeparture) { /* * Перебрать все рейсы по одному маршруту и найти тот, * который первым доставит в пункт назначения * * Вернуть рейс и время которое пройдёт до прибытия в следующий город */ var minTime = TimeSpan.MaxValue; var flightWithMinTime = new FlightModel(); foreach (var flight in flights) { var timeUntilEndOfFlight = TimeUntilEndOfFlight(flight, dayOfDeparture, timeOfDeparture); if (timeUntilEndOfFlight < minTime) { minTime = timeUntilEndOfFlight; flightWithMinTime = flight; } } return(flightWithMinTime, minTime); }
static private GraphNode FindWaysDijkstra(string dispatchCity, string arrivalCity, DepartureDay departureDay, TimeSpan departureTime) { /* * Найти город отправления * Установить время полёта в ноль * Проложить кротчайшие пути до всех связанных городов * Получить путь до города назначения */ var firstNode = Graph.Nodes.Find(node => node.Name == dispatchCity); if (firstNode == null) { return(null); } firstNode.TimeOfRoute = TimeSpan.Zero; BuildWaysFromNode(dispatchCity, departureDay, departureTime); return(Graph.Nodes.Find(node => node.Name == arrivalCity)); }