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()); }
public static bool IsEmtpy(WaitLine waitLine) { return(waitLine.queue == null || waitLine.queue.Count == 0); }