public int NumberOfPossibleStepsToSafelyMoveObjects(List <List <string> > objectFloors) { FloorState floorState = new FloorState(0, objectFloors, 0); _queue.Add(floorState); do { FloorState firstFloorState = _queue[0]; _queue.RemoveAt(0); // If answer, return it if (firstFloorState.IsComplete()) { return(firstFloorState.Step); } // If valid, get its posibilities if (!firstFloorState.IsInvalidSituation()) { ProcessFloorStatePossibilities(firstFloorState); } Debug.WriteLine($"steps: {firstFloorState.Step} state: {firstFloorState} prevStates: {_previousStates.Count} queue: {_queue.Count}."); } while (_queue.Any()); // Will never get there return(0); }
public void ProcessFloorStatePossibilities(FloorState floorState) { List <int> possibleElevatorStops = floorState.ListOfPossibleFloors(); foreach (int targetedFloor in possibleElevatorStops) { // Now need to handle all valid pairs List <string> objectFloorForPairs = floorState.CurrentObjectFloor().ToList(); var combinations = CombinationUtility.GetAllPermutationPairsOrderDoesNotMatter(objectFloorForPairs); foreach (var combo in combinations) { // If the two items are of different types, need to make sure valid /* * string element = combo.Item1.Substring(0, 1); * if ((combo.Item1.Contains("M") && combo.Item2.Contains("M")) || * (combo.Item1.Contains("G") && combo.Item2.Contains("G")) || * combo.Item2.Contains(element)) * { */ List <List <string> > copyOfObjectFloors = floorState.DeepCloneObjectFloors(); copyOfObjectFloors[targetedFloor].Add(combo.Item1); copyOfObjectFloors[targetedFloor].Add(combo.Item2); copyOfObjectFloors[floorState.Elevator].Remove(combo.Item1); copyOfObjectFloors[floorState.Elevator].Remove(combo.Item2); // Make new FloorState and if valid, add to queue FloorState newFloorState = new FloorState(floorState.Step + 1, copyOfObjectFloors, targetedFloor); if (!newFloorState.IsInvalidSituation() && floorState.PreviousStates.Contains(newFloorState, new FloorStateEqualityComparer()) == false) { var prevStates = floorState.DeepClonePreviousStates(); prevStates.Add(floorState); newFloorState.PreviousStates = prevStates; _queue.Add(newFloorState); } } // Can move one element, but only if there was not a valid pair movement List <string> objectFloor = floorState.CurrentObjectFloor().ToList(); foreach (string obj in objectFloor) { // Make a copy so we can modify original List <List <string> > copyOfObjectFloors = floorState.DeepCloneObjectFloors(); copyOfObjectFloors[targetedFloor].Add(obj); copyOfObjectFloors[floorState.Elevator].Remove(obj); // Make new FloorState and if valid, add to queue FloorState newFloorState = new FloorState(floorState.Step + 1, copyOfObjectFloors, targetedFloor); if (!newFloorState.IsInvalidSituation() && floorState.PreviousStates.Contains(newFloorState, new FloorStateEqualityComparer()) == false) { var prevStates = floorState.DeepClonePreviousStates(); prevStates.Add(floorState); newFloorState.PreviousStates = prevStates; _queue.Add(newFloorState); } } } }