目前爲止有兩種比較可行的思路:
第一種就是暑假完成做業時所使用的」先來先服務「思路,即根據乘客請求乘坐電梯的前後次序進行調度。這種思路的優勢是公平、簡單,每位乘客的請求都能依次的獲得處理。
實現步驟:首先構造對應的結構體存儲輸入的數據,而後將初始時混亂的時間順序按照升序排序,以便根據時間的前後順序來調度電梯運行,計算相鄰兩個請求的時間差來判斷電梯是否能夠將路徑方向相同的乘客帶上電梯,最後輸出電梯的運行時間及調度狀態。附上此種思路的簡單代碼構成:函數
#include<stdio.h> #include<math.h> FILE* stream; FILE* outputfile; int main () { struct elevator { int time; int start; int end; }ele[5],temp;//構造對應的結構體存儲數據 int i,j,sum=0,t=0; stream=fopen("input.txt","r"); outputfile=fopen("output.txt","w"); if(stream==NULL) printf("error"); else { for(i=0;i<5;i++) { fscanf(stream,"%d %d %d",&ele[i].time,&ele[i].start,&ele[i].end); } }//文件輸入 for(i=0;i<5;i++) for(j=0;j<4-i;j++) { if(ele[j].time>ele[j+1].time) { temp=ele[j]; ele[j]=ele[j+1]; ele[j+1]=temp; } }//利用冒泡法從小到大排序 for(i=0;i<5;i++) { if(i==0) { t=ele[i].time; t+=fabs(ele[i].start-1)+1+fabs(ele[i].end-ele[i].start); }//計算第一趟所用時間 else { if(ele[i].time-t-fabs(ele[i].start-ele[i-1].end)>0) t+=ele[i].time-t-fabs(ele[i].start-ele[i-1].end);//判斷電梯是否能夠將相同路徑的乘客帶上電梯 t+=fabs(ele[i].start-ele[i-1].end)+1+fabs(ele[i].end-ele[i].start); }//計算後四趟所用時間 sum+=t-ele[i].time; if(outputfile==NULL) printf("error"); else fprintf(outputfile,"%d時,停靠在%d樓\n",t,ele[i].end);//文件輸出 } printf("等待時間總和:%d",sum); return 0; }
第二種是」電梯往返運動進行掃描「的思路,相似於公交車的運行方式,乘客乘上電梯的次序與乘客請求的路徑方向和距離電梯的位置關係來決定,這種思路的好處在於一次掃描中可以將全部與電梯運行方向相同的乘客帶上電梯,避免了電梯頻繁的來回調度。spa
面向過程是分析出解決問題須要進行的步驟,而後經過調用函數將這些步驟一項一項的加以實現,最終達到解決問題的目的。
面向對象是分析出問題中包含的各類各樣的對象與需求,每一個對象實現自身的功能而且完成對應的需求,最終代碼的組成即爲各個對象之間分工合做的結果。3d
class Elevator { private: int currentFloor; // 電梯當前樓層 int direction; // 1 表明向上 ,0 表明向下 public: int floor = 0; int gotofloor(int a, int b);//前往出發點耗時 int wait(int time, int asktime);//等待請求時間 int finish(int fromfloor, int tofloor);//前往目的樓層耗時 Elevator(); ~Elevator(); }; int Elevator::gotofloor(int a, int b) { a = abs(a - b); return a; }//前往請求樓層耗時 int Elevator::wait(int time, int asktime) { if (asktime > time) { time = asktime - time; return time; } else return 0; }//等待下一次請求耗時 int Elevator::finish(int fromfloor, int tofloor) { fromfloor = abs(tofloor - fromfloor); return fromfloor; }//前往目的樓層耗時 Elevator::Elevator() { } Elevator::~Elevator() { cout<<"析構函數"<<endl; }