#include <vector>
#include <iostream>
typedef std::vector<unsigned int> uint_vector;
typedef std::vector<uint_vector> values_vector;
values_vector all_values (const uint_vector & ranges, unsigned int pos=0) {
values_vector result;
if (pos == ranges.size()) {
result.push_back (uint_vector());
}
else {
values_vector rem_result = all_values (ranges, pos+1);
for (unsigned int v = 0; v < ranges[pos]; ++v) {
for (auto it : rem_result) {
result.push_back (uint_vector(1,v));
result.back().insert (result.back().end(), it.begin(), it.end());
}
}
}
return result;
}
void print_values (const values_vector & combos) {
for (auto combo : combos) {
std::cout << "[ ";
for (auto num : combo) {
std::cout << num << ' ';
}
std::cout << "]\n";
}
}
int main () {
uint_vector ranges {3,2,2};
print_values (all_values (ranges));
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHVpbnRfdmVjdG9yOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnRfdmVjdG9yPiB2YWx1ZXNfdmVjdG9yOwoKdmFsdWVzX3ZlY3RvciBhbGxfdmFsdWVzIChjb25zdCB1aW50X3ZlY3RvciAmIHJhbmdlcywgdW5zaWduZWQgaW50IHBvcz0wKSB7CiAgIHZhbHVlc192ZWN0b3IgcmVzdWx0OwogICBpZiAocG9zID09IHJhbmdlcy5zaXplKCkpIHsKICAgICAgcmVzdWx0LnB1c2hfYmFjayAodWludF92ZWN0b3IoKSk7CiAgIH0gICAKICAgZWxzZSB7CiAgICAgIHZhbHVlc192ZWN0b3IgcmVtX3Jlc3VsdCA9IGFsbF92YWx1ZXMgKHJhbmdlcywgcG9zKzEpOwogICAgICBmb3IgKHVuc2lnbmVkIGludCB2ID0gMDsgdiA8IHJhbmdlc1twb3NdOyArK3YpIHsKICAgICAgICAgZm9yIChhdXRvIGl0IDogcmVtX3Jlc3VsdCkgewogICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrICh1aW50X3ZlY3RvcigxLHYpKTsKICAgICAgICAgICAgcmVzdWx0LmJhY2soKS5pbnNlcnQgKHJlc3VsdC5iYWNrKCkuZW5kKCksIGl0LmJlZ2luKCksIGl0LmVuZCgpKTsKICAgICAgICAgfQogICAgICB9ICAgCiAgIH0gICAKICAgcmV0dXJuIHJlc3VsdDsKfQoKdm9pZCBwcmludF92YWx1ZXMgKGNvbnN0IHZhbHVlc192ZWN0b3IgJiBjb21ib3MpIHsKICAgZm9yIChhdXRvIGNvbWJvIDogY29tYm9zKSB7CiAgICAgIHN0ZDo6Y291dCA8PCAiWyAiOwogICAgICBmb3IgKGF1dG8gbnVtIDogY29tYm8pIHsKICAgICAgICAgc3RkOjpjb3V0IDw8IG51bSA8PCAnICc7CiAgICAgIH0gICAKICAgICAgc3RkOjpjb3V0IDw8ICJdXG4iOwogICB9ICAgCn0KCmludCBtYWluICgpIHsKICAgdWludF92ZWN0b3IgcmFuZ2VzIHszLDIsMn07CiAgIHByaW50X3ZhbHVlcyAoYWxsX3ZhbHVlcyAocmFuZ2VzKSk7CiAgIHJldHVybiAwOwp9