Esempio n. 1
0
        public IList <string> Run(string[,] input)
        {
            var tickets = input;

            var flightList = new List <FlightPair>();

            for (int i = 0; i < input.GetLength(0); i++)
            {
                flightList.Add(new FlightPair(input[i, 0], input[i, 1]));
            }
            flightList.Sort();

            var airportMap = new Dictionary <string, FlightMap>();

            foreach (var pair in flightList)
            {
                if (!airportMap.ContainsKey(pair.Departure))
                {
                    airportMap.Add(pair.Departure, new FlightMap(pair.Departure));
                }

                if (!airportMap.ContainsKey(pair.Destination))
                {
                    airportMap.Add(pair.Destination, new FlightMap(pair.Destination));
                }

                var departures = airportMap[pair.Departure].GetNoNextNodes();
                if (departures.Count == 0)
                {
                    var departure = new FlightNode(pair.Departure);
                    airportMap[pair.Departure].AddNode(departure);
                    departures.Add(departure);
                }
                var destinations = airportMap[pair.Destination].GetNoPrevNodes();
                if (destinations.Count == 0)
                {
                    var destination = new FlightNode(pair.Destination);
                    airportMap[pair.Destination].AddNode(destination);
                    destinations.Add(destination);
                }

                var valid = false;

                foreach (var departure in departures)
                {
                    if (valid)
                    {
                        continue;
                    }
                    foreach (var destination in destinations)
                    {
                        if (valid)
                        {
                            continue;
                        }
                        departure.Next   = destination;
                        destination.Prev = departure;
                        var hasLoop = TestForLoop(departure);
                        if (hasLoop)
                        {
                            departure.Next   = null;
                            destination.Prev = null;
                        }
                        else
                        {
                            valid = true;
                        }
                    }
                }
            }

            var sampleNode = airportMap[input[0, 0]].Nodes[0];

            while (sampleNode.HasPrev())
            {
                sampleNode = sampleNode.Prev;
            }

            var resultList = new List <string>();

            while (sampleNode != null)
            {
                resultList.Add(sampleNode.Name);
                sampleNode = sampleNode.Next;
            }

            return(resultList);
        }