Порождающий вектор

В настоящее время я пытаюсь написать функцию, которая позволит мне создать powerset вектора. В настоящее время у меня есть вектор объектов и пустой вектор векторов. Я посмотрел вокруг в Интернете, и нашел рекурсивный алгоритм, но не смог заставить его работать в моем случае.

Алгоритм:

void Game::PowersetRec(vector <Die> & s, int k, int m, int n) {
// Recursively builds a vector which is the powerset of the input vector
if (m <= n) {
s[k+1].pips = m ;
powerset.push_back(s) ;
PowersetRec(s, k+1, m+1, n) ; /* with m */
PowersetRec(s, k, m+1, n) ; /*  without m */
}
}

.

PowersetRec(rolledDice, 0, rolledDice[0].pips, rolledDice[rolledDice.size() - 1].pips);

powerset мой вектор векторов и rolledDice это вектор Die объекты, которые имеют pips атрибут (который является целым числом).

Когда я распечатываю powerset, я получаю это (образец):

1, 1, 4, 6, 4, 6
1, 1, 2, 6, 4, 6
1, 1, 2, 3, 4, 6
1, 1, 2, 3, 4, 5

Что имеет смысл для меня, учитывая алгоритм, но это не набор параметров, то есть я не знаю, как работал оригинальный алгоритм.

Редактировать: Этот ответ Кажется полезным, но я не могу получить перечисленный код (комбинации) для компиляции в GCC.

0

Решение

Я смог ответить на вопрос через: различные комбинации значений вектора

Я просто изменил char на мой объект die.

Изменить: Полный код ниже.

void Game::PowersetGen(vector <Die> & v) {
for (int counter = 1; counter < (1 << v.size()); ++counter) {
vector <Die> combination;
for (int i = 0; i < v.size(); ++i)
{
if (counter & (1 << i))
combination.push_back(v[i]);
}

powerset.push_back(combination);
}
}

Простое уточняющее редактирование: <Die> это просто имя объекта в моем векторе, в идеале эта функция должна быть настроена на использование любого типа данных.

0

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

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

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