簡體   English   中英

使用PHP分配房間的算法

[英]Algorithm for Room Allocation Using PHP

我需要有關將房間分配給人們的算法的幫助。 我需要重新整理房間列表以將房間分配給一個人,並且在將第四個人分配給房間后,它應該不在列表中(應該不可用)。 我還沒有通過PHP改組和排序功能獲得任何運氣。

任何幫助(指針,參考等)將不勝感激。

這聽起來既是一項家庭作業,又是成千上萬個解決方案的問題。

正如Jack所說的那樣,請先嘗試開發算法,然后再嘗試在代碼中實現它。 如果您在理解時遇到困難,那就想象一下場景並嘗試編寫簡單的規則來解決現實生活中的問題

假設我有一個有10個房間的走廊。 每個房間最多可容納4人。 然后,有35個人出現並希望分配到房間。 我該怎么做?

我可能會從走廊的開頭開始,填滿第一個房間,然后填滿下一個房間,然后繼續直到我用完人或房間(以先到者為准)。 該解決方案的優點是不必走得很遠,而將4人擠到一個房間而不是均勻地分散。

如果您選擇將它們均勻散布,則需要在第一個房間放一個,然后在第二個房間放一個,依此類推。直到您用完所有房間,然后再回到每個房間放第二個人。

由於您有兩種方法可以執行此操作,因此下一步是確定如何在代碼中表示基本組件。 您需要一種代表房間的方式和一種代表人的方式。 房間的最重要特征是最多可容納四個人,但始終必須知道要容納多少人。 因此,最好將每個房間都視為自己的房間號,這個數字告訴您房間中已經有多少人了。

在PHP中,如果要關聯和排序的多個數字(就像走廊中的房間一樣),可以使用數組。 當您有多個需要彼此關聯並保持其各自順序的ANY變量時,這是正確的。

$rooms = array(0, 0, 0, 0, 0); // 5 rooms, all with 0 people in them

如果您的房間需要知道留在房間里(如果他們需要區分不同的客人),那么您可以將每個房間視為一個由4個元素組成的數組,其中每個元素代表一個人並能夠識別該人。

$rooms = array(
    array(null, null, null, null),
    array(null, null, null, null),
    array(null, null, null, null),
    array(null, null, null, null),
    array(null, null, null, null)
);

創建房間后,將有一定數量的人在等待進入房間。 由於每個人僅計為1 ,除非您需要記住有關每個人的其他信息(例如他們的姓名,年齡等),否則您應該能夠看到一種非常方便的代表人的方式。

$peopleNotInARoomYet = 10;

如果您確實需要記住有關這些人的其他信息(假設分配房間后,系統提示您“鮑勃在哪個房間里?”的問題),那么您將需要一些更聰明的東西。 也許是一系列班級,每個班級代表一個人。 當然,除非該人僅需要由單個變量表示。 然后,您可以將他們煮成一個數組。

$peopleNotInARoomYet = array("Bob", "Sally", "Bill", "Mary");
//or
$peopleNotInARoomYet = array(new Person('Bob'), new Person('Sally'), new Person('Bill'), new Person('Mary'));

請注意,第二個方法要求已經定義了Person類,如果不小心,它可能會非常復雜。

一旦有了代表人們的方式,就想遍歷每個人來找到他們的房間。 如果人用一個數字表示,則如下所示:

while($peopleNotInARoomYet > 0){
    // Assign a room
    $peopleNotInARoomYet--;
}

如果將人員表示為數組,則可能需要考慮使用PHP array_pop()函數。

PHP.net array_pop手冊

$nextPerson = array_pop($peopleNotInARoomYet){
while($nextPerson != NULL){
    // Assign a room
    $nextPerson = array_pop($peopleNotInARoomYet);
}

現在有了一種表示房間和人的方式,您的新任務是從上面接受我們對分配的定義,並將其轉換為代碼。 因此,讓我們看一下我們的第一個(也許更簡單)的方法。 我們將人們放到一個房間,直到房間滿為止,然后轉到下一個房間。

這實際上帶來了一些算法挑戰。 首先,您如何“將某人帶入房間”?

答案實際上取決於我們使用的房間定義。 如果我們只是有一個整數數組(當我們關心一個房間中有多少人,卻不在乎在房間中時),那么我們需要向這個整數加一個。

如果我們有一個由4個元素組成的數組,那么我們需要找到第一個空元素並將人放置在該元素中。 將一個人放到非空元素中將替換以前在那里的人。

由於從第一次嘗試將規則集轉換為代碼很明顯,該方法將根據所選擇的實現而有所不同,在本示例的其余部分中,我將假設房間只需要知道其中多少人 ,而不是誰是誰。在他們具體。 如果您確實需要這些進一步的信息,那么這是一個由讀者自己決定的課程。

因此,這是我們對房間,人的定義以及循環的開始:

<?php
    $rooms = array(0, 0, 0, 0, 0); // 5 empty rooms
    $peopleNotInRoomsYet = 14; // We'll choose a number that won't divide evenly

    while($peopleNotInRoomsYet > 0){
        // Assign a room
        $peopleNotInRoomsYet --;
    }
?>

而且我們知道,一旦我們選擇要放置某人的房間,實際上將他們放置在其中涉及以下內容:

$rooms[$roomNumber]++;

現在,讓我們回到我們最初的問題定義,看看我們從哪里開始。 我們要填充第一個房間,然后填充第二個,然后填充第三個,依此類推。

因此,首先我們需要一種定義填充房間的方法。 填滿一個房間要涉及將人們放入其中(完成),直到它填滿(沒有完成)。 因此,現在我們需要一種檢查房間是否已滿的方法。

if($rooms[$roomNumber] == 4)

應該做得很好。 因此,現在我們有了一種“將房間填滿直到填滿”的方法。但是在此之后,我們需要從下一個房間開始。 這意味着我們需要始終知道我們當前正在填充哪個房間。 如果我們需要了解一些新內容,則需要一個新變量。 我們將此變量稱為$roomNumber 我們將從$roomNumber = 0; (數組中的第一個房間)並繼續到5 由於沒有第六個房間(元素5),因此如果$roomNumber變為5,我們將有太多人。

<?php
    $rooms = array(0, 0, 0, 0, 0); // 5 empty rooms
    $peopleNotInRoomsYet = 14; // We'll choose a number that won't divide evenly
    $roomNumber = 0;

    while($peopleNotInRoomsYet > 0){ // If there are people waiting...
        if($rooms[$roomNumber] == 4){ // If the room is full...
            $roomNumber ++; // Go to the next room
        }
        if($roomNumber == 5){ // If we are out of rooms...
            die("Too many people!!!"); // die
        }
        $rooms[$roomNumber] ++; // Otherwise, add someone to the room
        $peopleNotInRoomsYet --; // And remove them from the waiting list
    }
?>

我知道對於最后的少量代碼來說,這是很長的時間,但是我試圖解釋從概念到代碼的過程。 認識到需要遵循的簡單規則,然后認識到需要跟蹤的項目。 還要記住,我發布的解決方案僅在最簡單的情況下有效,因為您不需要知道房間里的是多少。 它還假定沒有任何房間以任何人開始。 如果第二個房間開始滿了,那么該算法將崩潰,因為我沒有檢查。 讀者還有很多修改要做,但這應該使您指向正確的方向。

這不是一個直接的PHP問題,您應該首先描述算法,然后嘗試實現它。

根據我的理解,最好的解決方案是按實際空置空間排序房間列表(因此,一開始您將有空房間,然后是1個人的房間,再是2個人的房間,等等)。

然后,無論何時有新用戶來,您都必須選擇一項策略以將其分配給房間,例如,您可以選擇始終將新來者添加到最空的房間(因此,您將在空房間之間或在空房間之間選擇一個隨機的房間)。房間,如果沒有空房間,只能容納1個人,依此類推)。或者您可以決定將其分配給一個不滿的隨機房間。 這取決於您真正需要做什么。

無論如何,您都可以保留2個房間列表,一個用於未滿房間,另一個用於滿房間。 當一個房間因為新人填補而變滿時,您只需將其交換到另一個列表中即可。 當用戶離開房間時,您可以將其切換回原始列表。

當然,僅當您需要根據某個房間中有多少個空閑空間來執行選擇時,將未滿的房間列表按空的空間排序是很有用的,否則,您可以將所有這些都放在一起並隨機選擇一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM