Мне нужен алгоритм, который напоминает поведение переоценки цикла for условия тестирования - PullRequest
0 голосов
/ 22 февраля 2019

Я перебираю массив ящиков, которые помещены в контейнер.Например, контейнер может хранить уровень "10" ящиков.если массив [6, 5, 2].У меня будет два контейнера: один с [6, 2] и один с [5], массив был повторен, он захватил 6, пропустил 5 и захватил 2. Он пропустил 5, потому что 6 + 5 равен 11. Контейнер не может иметь большечем уровень 10. Пропущенный 5 помещается в отдельный массив для последующей итерации.

Ниже я подведу итог моей проблемы.Это не рабочий код.Я просто демострирую свою проблему.

$boxes = [2, 3, 2, 5, 8, 2, 10, 2, 5, 6]; // my boxes

$separated_boxes = [];
$items = [];

for($i = 0; $i < count($boxes); $i++){

 $items[] = $box[$i]; //add box to array

  $result = Class::packBoxes($items) // check if the box(es) can be packed

 //if the current box cannot be packed it is separated
  if($result == false)
  {
     $separated_boxes[] = $box[$i];
  }

   //if the loop reaches the end a new loop should start with the separated boxes

//Apparently I cannot do this because the for conditions are avalidated only once

    if((($i + 1) == count($boxes) && count($separated_boxes) > 0)){

               $itens = [];
                $i = 0;
                $boxes= $separated_boxes;
                $separated_boxes= [];
       }
 }

   packBoxes($boxes)
{
  if(canPack($box)
   {
      return true;
   }
   else{
       return false;
   }
}

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 22 февраля 2019

Вы думаете, что это неправильная петля для этого.for - подобные циклы обычно используются для выполнения каких-либо действий для каждого элемента на входе один раз .

Но это не то, что вам нужно.Вам нужно проверять элементы во входных данных несколько раз , откладывать их и возвращаться к ним, пока все они не будут распределены по контейнерам.

Есть много способов написать это (цикл, итератор, рекурсивная функция, объект с логикой ...).С точки зрения цикла вы можете попробовать do-while такой:

do {

  // take items out of $boxes until you fill <=10 units container

} while( ! empty( $boxes ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...