public SimulationParameters AboveWithDirection(ClosestElevator elevator, Direction direction, bool elevatorIsCloneGoingToRightDirection)
    {
        var totalClones = NbTotalClones;

        if (!elevatorIsCloneGoingToRightDirection)
        {
            totalClones--;
        }

        return(new SimulationParameters(CloneFloor + 1, elevator.Position, direction, ElevatorsToBuild, totalClones));
    }
    private MapReturn LastFloorReturnLeft(SimulationParameters simulationParameters,
                                          Direction returnDirection, ClosestElevator elevator)
    {
        if (elevator != null && elevator.Position > _exitPosition)
        {
            return(new MapReturn(int.MaxValue, returnDirection));
        }

        var distance = Floor.GetDistance(simulationParameters.ClonePos, _exitPosition, simulationParameters.Direction);

        return(new MapReturn(distance, returnDirection));
    }
    private int CalculateFor(SimulationParameters simulationParameters, ClosestElevator elevator, Direction direction)
    {
        if (elevator == null)
        {
            return(int.MaxValue);
        }

        var aboveWithWrongDirection = simulationParameters.AboveWithDirection(elevator, direction, elevator.IsCloneGoingToRightDirection);
        var totalTravel             = ShortPath(aboveWithWrongDirection).TotalTravel;

        if (totalTravel == int.MaxValue)
        {
            return(totalTravel);
        }

        return(elevator.Distance + totalTravel);
    }