Пример #1
0
        public static string SimulationElevator(
            List <Passenger> passengers,
            int waitTime,
            int capacity)
        {
            var timeClock = new TimeClock();

            timeClock.Time = 0;

            var studentsWaitLine = new WaitLine();
            var teachersWaitLine = new WaitLine();

            int roryTime           = 0;
            int lastTripFinishTime = 0;

            var trip = new Trip();

            int indexOfPassengers = 0;
            int tripIndex         = 1;

            while (true)
            {
                //studentsWaitLine.queue.Clear();
                //teachersWaitLine.queue.Clear();

                // need to compare Math.Max between timeClock.Time and first passenger's time
                int oneByTimeClock = timeClock.Time;
                int endTime        = 0;

                for (int i = indexOfPassengers; i < passengers.Count; i++)
                {
                    if (i == indexOfPassengers)
                    {
                        int timeByPassengerArrival = passengers[i].ArrivalTime;

                        endTime = oneByTimeClock;
                        // determine endTime
                        bool isWaitLineEmtpy = waitLineIsEmtpy(studentsWaitLine.queue, teachersWaitLine.queue);

                        if (isWaitLineEmtpy)
                        {
                            endTime = Math.Max(oneByTimeClock, passengers[i].ArrivalTime);
                        }

                        endTime += waitTime;

                        // update timeClock time
                        if (isWaitLineEmtpy && timeByPassengerArrival > oneByTimeClock)
                        {
                            timeClock.Time = timeByPassengerArrival;
                        }
                    }

                    if (passengers[i].ArrivalTime > endTime)
                    {
                        indexOfPassengers = i; // Load for next trip
                        break;
                    }

                    if (i == (passengers.Count - 1))
                    {
                        indexOfPassengers = passengers.Count; // help to terminate the loop
                    }

                    // add a member function for class WaitLine
                    int id = passengers[i].Id;
                    if (id == 1)
                    {
                        if (studentsWaitLine.queue == null)
                        {
                            studentsWaitLine.queue = new Queue <Passenger>();
                        }

                        studentsWaitLine.queue.Enqueue(passengers[i]);
                    }
                    else
                    {
                        if (teachersWaitLine.queue == null)
                        {
                            teachersWaitLine.queue = new Queue <Passenger>();
                        }

                        teachersWaitLine.queue.Enqueue(passengers[i]);
                    }
                }

                // cannot load any passengers, break loop
                if (
                    WaitLine.IsEmtpy(studentsWaitLine) &&
                    WaitLine.IsEmtpy(teachersWaitLine))
                {
                    break;
                }

                int count = 0;
                while (count < capacity)
                {
                    if (teachersWaitLine.queue.Count() > 0)
                    {
                        // add member function in class Trip
                        var passenger = teachersWaitLine.queue.Dequeue();
                        if (trip.teachers == null)
                        {
                            trip.teachers = new List <Passenger>();
                            trip.teachers.Add(passenger);
                        }
                        else
                        {
                            var tripPassengers = trip.teachers;
                            tripPassengers.Add(passenger);
                            trip.teachers = tripPassengers;
                        }

                        count++;
                        continue;
                    }

                    if (studentsWaitLine.queue.Count() > 0)
                    {
                        var passenger = studentsWaitLine.queue.Dequeue();
                        if (trip.students == null)
                        {
                            trip.students = new List <Passenger>();
                            trip.students.Add(passenger);
                        }
                        else
                        {
                            var tripPassengers = trip.students;
                            tripPassengers.Add(passenger);
                            trip.students = tripPassengers;
                        }

                        count++;
                        continue;
                    }

                    if (teachersWaitLine.queue.Count() == 0 &&
                        studentsWaitLine.queue.Count() == 0)
                    {
                        break;
                    }
                }

                timeClock.Time += waitTime;

                // run the trip
                trip.RunElevatorRoundTrip(
                    ref timeClock,
                    trip,
                    ref roryTime,
                    ref lastTripFinishTime,
                    tripIndex);
                tripIndex++;

                // clear trip passengers
                trip.students.Clear();
                trip.teachers.Clear();
            }

            return(roryTime.ToString() + " " + lastTripFinishTime.ToString());
        }
Пример #2
0
 public static bool IsEmtpy(WaitLine waitLine)
 {
     return(waitLine.queue == null || waitLine.queue.Count == 0);
 }