六、某電梯管理系統控制多台電梯,當某樓層之等待區按下按鈕時,會將其樓層號碼傳送到系統之共用Queue中,系統會定時自共用Queue中讀取一筆目標樓層號碼,並尋找離此目標樓層最近的電梯來提供服務。請使用下列所有的函式,來撰寫一 選取電梯函式SelElev,輸入為電梯的總數,其傳回為離目標樓層最近的電梯號碼,但當未選擇到電梯時,則傳回0。另外, 當電梯總數為N時,電梯號碼為1到N;樓層號碼為1代表1樓、2代表2樓、0代表地下1樓、-1代表地下2樓(依此類推)。(20分)
int getqueue() /* 自共用Queue中取得下一筆目標樓層號碼。其傳回為下一筆目標樓層號碼,當無資料時,則傳回999。 */
int getcurfloor(int elevid) /* 取得指定電梯目前所在的樓層。輸入為電梯號碼,其傳回為此電梯目前所在的樓層,但當此電梯不提供服務時,則傳回999。 */
詳解 (共 2 筆)
詳解
int SelElev(int N)
{
int target = getqueue();
if (target == 999)
return 0;
int elveNum = 0; // 電梯號碼
int dist = INT_MAX; // 電梯與目標樓層之距離
for (int i = 1; i <= N; i++)
{
int currFloor = getcurfloor(i);
// 如果電梯不提供服務,則跳過此電梯
if (currFloor == 999)
continue;
int k = abs(target - currFloor);
dist = min(dist, k);
// 當dist==k為true時, 表示距離更新為現在的k值, 因此要更新電梯號碼
if (dist == k)
elveNum = i;
}
// 如果所有電梯皆不提供服務,則elveNum未更新,回傳0
if (elveNum == 0)
return 0;
return elveNum;
}
詳解
def SelElev(N) :
waitfloor = getquene()
dist = 999 //初始化距離
m = 999 //選定的電梯
for num in range(1,N) :
runfloor = getcurfloor(num)
if abs(waitfloor-runfloor) <= dist //距離較近的電梯
dist = runfloor
m = num
return m