#include <iostream>
#include <vector>
template<typename T>
class Permutations {
public:
std::vector<std::vector<T> > getPermutations(const std::vector<T>& arrT, int m) {
std::vector<std::vector<T> > result;
std::vector<T> current;
std::vector<bool> used(arrT.size(), false);
permute(arrT, m, used, current, result);
return result;
}
private:
void permute(const std::vector<T>& arrT, int m, std::vector<bool>& used, std::vector<T>& current, std::vector<std::vector<T> >& result) {
if (current.size() == m) {
result.push_back(current);
return;
}
for (size_t i = 0; i < arrT.size(); ++i) {
if (!used[i]) {
used[i] = true;
current.push_back(arrT[i]);
permute(arrT, m, used, current, result);
current.pop_back();
used[i] = false;
}
}
}
};
template<typename T>
class Combinations {
public:
std::vector<std::vector<T> > getCombinations(const std::vector<T>& arrT, int m) {
std::vector<std::vector<T> > result;
std::vector<T> current;
combine(arrT, m, 0, current, result);
return result;
}
private:
void combine(const std::vector<T>& arrT, int m, int start, std::vector<T>& current, std::vector<std::vector<T> >& result) {
if (m == 0) {
result.push_back(current);
return;
}
for (int i = start; i <= static_cast<int>(arrT.size()) - m; ++i) {
current.push_back(arrT[i]);
combine(arrT, m - 1, i + 1, current, result);
current.pop_back();
}
}
};
int main() {
std::vector<int> arrT = {1, 2, 3, 4};
int m = 2;
Permutations<int> permutations;
std::vector<std::vector<int> > perms = permutations.getPermutations(arrT, m);
std::cout << "Permutations:" << std::endl;
for (size_t i = 0; i < perms.size(); ++i) {
for (size_t j = 0; j < perms[i].size(); ++j) {
std::cout << perms[i][j] << " ";
}
std::cout << std::endl;
}
Combinations<int> combinations;
std::vector<std::vector<int> > combos = combinations.getCombinations(arrT, m);
std::cout << "Combinations:" << std::endl;
for (size_t i = 0; i < combos.size(); ++i) {
for (size_t j = 0; j < combos[i].size(); ++j) {
std::cout << combos[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
文章评论