一棟10層的大樓(樓層編號1-10),設有一臺無限載重的電梯,初始時電梯停在1層。電梯移動1層的耗時爲1,在某一層停靠的耗時爲1(時間初始爲0)。爲了使得乘客等待的時間(電梯在目的層的停靠時刻 - 乘客發出請求時刻)總和最小,請你編寫一個程序來進行電梯調度。c++
輸入有5個請求,每一個請求一行,格式爲請求時刻 起始樓層數 去往方向,其中方向爲0表明向上去往10層,爲1表明向下去往1層。
輸出每次對應的決策,每一行的輸出格式爲xx時,停靠在x樓。其中,「xx時刻」指的是在某層樓停靠的時刻,且不算入在該層的停靠時間。如:git
1.當0時刻時,電梯此時在1層,輸入有0 1 0,那麼電梯從1層接客(1s)前往10層(9s),應輸出10時,停靠在10樓(1+9=10)。此時,該乘客等待時間爲(10-0=)10。
2.當0時刻,電梯此時在1層,輸入有0 2 0,那麼電梯從1層前往2層(1s),接上乘客(1s),前往10層(8s),應輸出10時,停靠在10樓(1+1+8=10)。此時,該乘客等待時間爲(10-0=)10s。
最後輸出完成5個請求(全部乘客都到達目的地)後,各乘客的等待時間總和。github
請本身設計5組測試用例,且具備必定表明性,用以驗證程序是不是最小耗時。編程
編程語言選擇C或C++均可以,但須要符合編碼規範,且必需要有註釋。要求在github上創建一個倉庫,將本次做業代碼提交到該倉庫,並在博客開頭給出倉庫地址。注意:commit信息要遵照必定的git規範(可參看:git commit 規範指南),git必須使用命令行操做,不要使用github圖形界面(可參看:廖雪峯Git教程)。數組
寫一篇博客,在博客中描述在編碼過程當中,程序的不斷優化過程。並列出一張表格,記錄編寫程序的代碼行數、調試的bug數 、完成該次做業總耗時。編程語言
引入時間變量time記錄總時間,運行到每一個點判斷向上和向下的請求數並執行較大者(向下的請求數=目標爲1樓的請求個數+此時電梯下方未上電梯的請求個數,向上的請求數同理。當某一請求的請求時刻>time或已經登上電梯時,該請求不歸入計算。),每次運行到請求點或目的地時再執行判斷,直到全部乘客都到達目的地。函數
把5個請求(a,b,c)輸入到結構體變量數組request[5]中,並按起始樓層從低到高將數組排序。測試
#include<stdio.h> int main() { struct request { int a; int b; int c; } request[5],temp;//定義結構體數組request和變量temp,用於於存入請求和暫存排序交換。 int i,j,down=0,up=0,time=0,sum_c=0,t[20],f[20],un_down=0,un_up=0,down_ac,up_ac,down_to_1=0,up_to_10=0,above=0,below=0,ac=0,f_now; //a[20]用來存目標樓層 for(i=0;i<5;i++) scanf("%d%d%d",&request[i].a,&request[i].b,&request[i].c);//輸入5個請求賦值到結構體變量數組中 。 for(i=1;i<5;i++) { sum_c+=request[i].c; if(request[i].b<request[i-1].b) { temp=request[i];request[i]=request[i-1];request[i-1]=temp; }//按起始樓層從低到高排序數組。 } for(time=0; ;time++) { for(i=0;i<5;i++) { if(request[i].b!=0) { if(request[i].b<f_now) below++;//below記錄此時電梯下方且未上電梯的請求個數 else above++;//above記錄此時電梯上方且未上電梯的請求個數 } } down=sum_c+below;//向下的請求數=目標爲1樓的請求個數+此時電梯下方且未上電梯的請求個數 up=5-sum_c+5-below;//向下的請求數=目標爲10樓的請求個數+此時電梯上方且未上電梯的請求個數 for(ac=1;;) { if(down>=up) { if(i==0) f_now=1; else f_now=request[i-1].b; if(f_now==1) for(i=0;i<5;i++) if(request[i].c==1) { request[i].b=0;down_to_1=1;//down_to_1=1表示向下到一樓的乘客已經到達 } } else { if(i=4) f_now=10; else f_now=request[i+1].b; if(f_now==10) for(i=0;i<5;i++) if(request[i].c==10) { request[i].b=0;up_to_10=1; } } for(j=0;j<5;j++) if(request[j].b==f_now) { t[ac]=time;f[ac]==f_now;ac++;//ac記錄電梯第幾回停靠,t[ac]記錄停靠時間,f[ac]記錄停靠樓層 } } if(down_to_1==1&&up_to_10==1) break; } for(i=1;i<ac;i++) printf("%d時,停靠在%d樓",t[ac],f[ac]); return 0; }
1.從電梯有幾種運行路線出發,分爲不回頭,回頭一次,回頭兩次...結果發現狀況太複雜,判斷條件太難寫,不可實現就捨棄了。
2.從逆向考慮,問題至關於電梯在一樓先載上全部人,而後再逐個卸下。而後最後發現並不能使問題簡單化。優化
1.把一些函數從主函數中剝離出來,下降代碼的耦合度
2.代碼還未完成,有不少bug
3.還未創建git庫編碼