private static bool DoDepthFirstSearchingAux(Dictionary<string, int> existingRoutes, ref MaxTripsResult runningResult, string fromToKey, string requestedRoute, ref int runningStops, int maxStops) { // Concept: the minute you have entered this function, you have gone from...to. (See fromToKey.) So update recordkeeping now. UpdateRunningStops(ref runningStops); if (!CheckIfMaxStopsExceeded(runningStops, maxStops)) return false; runningResult.Legs.Add(new Trip{Leg = fromToKey, Distance = existingRoutes[fromToKey]}); var requestedDest = requestedRoute[1]; var currentDest = fromToKey[1]; if (YouHaveReachedYourDestination(requestedDest, currentDest)) return true; var nextLocation = currentDest; var possibleRoutes = existingRoutes.Where(r => r.Key[0] == nextLocation); if (!possibleRoutes.Any()) return false; foreach (var route in possibleRoutes) { var savedRunningResult = runningResult; if (DoDepthFirstSearchingAux(existingRoutes, ref savedRunningResult, route.Key, requestedRoute, ref runningStops, maxStops)) { return true; } runningResult = savedRunningResult; } return false; }
private static List<MaxTripsResult> DoDepthFirstSearching(Dictionary<string, int> availableRoutes, string requestedRoute, int maxStops) { var results = new List<MaxTripsResult>(); var possibleLegs = availableRoutes.Where(r => r.Key[0] == requestedRoute[0]); foreach (var legs in possibleLegs) { var tempResult = new MaxTripsResult {Legs = new List<Trip>()}; var runningStops = 0; if (DoDepthFirstSearchingAux(availableRoutes, ref tempResult, legs.Key, requestedRoute, ref runningStops, maxStops)) { results.Add(tempResult); }; } return results; }
public void OneTripReturnedLessThanMaxStops() { var requestedTrip = "AD"; var exactStops = 2; var threeStopTrip = new List<Trip>{new Trip(), new Trip(), new Trip(), new Trip()}; var maxTripsResult = new MaxTripsResult{Legs = threeStopTrip}; var oneTripReturned = new List<MaxTripsResult> { maxTripsResult, }; _maxTripsCalculator.Expect( mtc => mtc.Invoke(Arg<Dictionary<string, int>>.Is.Anything, Arg<string>.Is.Anything, Arg<int>.Is.Anything)).Return(oneTripReturned); var numTrips = _calcer.Invoke(_possibleLegs, requestedTrip, exactStops); Assert.That(numTrips, Is.EqualTo(0)); }
private static bool ResultMatchesRequestedStops(int exactStops, MaxTripsResult result) { return result.Legs.Count - 1 == exactStops; }