Как разделить группу людей на дуэты и / или одиночные игры, как мне найти все возможные конфигурации разделов?

Итак, у меня есть группа людей, обычно от 15 до 30 человек. У меня есть класс Person представлять каждого человека. У меня тоже есть класс Match с представляет дуэт с его свойствами $person1 а также $person2что, кстати, также может указывать на то, что один и тот же человек представляет кого-то, кто разделен по отдельности.

Таким образом, у меня есть массив всех возможных совпадений, что означает все возможные дуэты и все возможные синглы. С моей текущей настройкой, которая добавляет до 120 совпадений. Теперь я хочу найти все возможные конфигурации, чтобы соединить эти дуэты и синглы так, чтобы они снова складывались во всю группу. Конечно, это означает, что каждый человек появляется ровно один раз в каждой конфигурации.

Я удобно отформатировал массив следующим образом: $this->matches['John']['Mary'] содержит Матч Джона и Марии; а также $this->matches['John']['John'] содержит совпадение Джона с самим собой, так что представляет собой один.

Теперь я попробовал то, что хотел сделать с помощью следующей рекурсивной функции:

protected function makeConfigs(&$matches)
{
// If we're at maximum recursion depth then just return what we have...
if (count($matches) == 1)
return array_values(current($matches));

$configs = [];

array_walk_recursive(
$matches,
function($match) use ($matches, &$configs) {
// Of course when we use a certain match
// then all other matches with the same people
// cannot be used anymore for the rest of the config
unset($matches[$match->person1->name]);
unset($matches[$match->person2->name]);

$configs = array_merge(
$configs,
array_merge(
[$match],
$this->makeConfigs($matches)
)
);
}
);

return $configs;
}

Но, к сожалению, это создает эту ошибку: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes),

Поэтому мне интересно, есть ли более эффективный способ сделать это?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]