В настоящее время я пытаюсь написать функцию, которая позволит мне создать 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.
Я смог ответить на вопрос через: различные комбинации значений вектора
Я просто изменил 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>
это просто имя объекта в моем векторе, в идеале эта функция должна быть настроена на использование любого типа данных.
Других решений пока нет …