#include <iostream>
#include <algorithm>
#include <vector>
bool increase(std::size_t size, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] > size) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
template <typename F, typename T>
void self_cartesian_product(F&& f, const std::vector<T>& v, std::size_t N)
{
std::vector<std::size_t> it(N, 0);
do {
f(v, it);
} while (increase(v.size(), it));
}
int main()
{
self_cartesian_product([](const auto& v, const auto& indexes)
{
for (auto i : indexes) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
},
std::vector<int>{-2, -1, 0, 1, 2},
3);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgoKYm9vbCBpbmNyZWFzZShzdGQ6OnNpemVfdCBzaXplLCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0KQp7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwLCBzaXplID0gaXQuc2l6ZSgpOyBpICE9IHNpemU7ICsraSkgewogICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGluZGV4ID0gc2l6ZSAtIDEgLSBpOwogICAgICAgICsraXRbaW5kZXhdOwogICAgICAgIGlmIChpdFtpbmRleF0gPiBzaXplKSB7CiAgICAgICAgICAgIGl0W2luZGV4XSA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUgVD4Kdm9pZCBzZWxmX2NhcnRlc2lhbl9wcm9kdWN0KEYmJiBmLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdiwgc3RkOjpzaXplX3QgTikKewogICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGl0KE4sIDApOwoKICAgIGRvIHsKICAgICAgICBmKHYsIGl0KTsKICAgIH0gd2hpbGUgKGluY3JlYXNlKHYuc2l6ZSgpLCBpdCkpOwp9CgoKaW50IG1haW4oKQp7CiAgICBzZWxmX2NhcnRlc2lhbl9wcm9kdWN0KFtdKGNvbnN0IGF1dG8mIHYsIGNvbnN0IGF1dG8mIGluZGV4ZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAoYXV0byBpIDogaW5kZXhlcykgewogICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB2W2ldIDw8ICIgIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIH0sCiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD57LTIsIC0xLCAwLCAxLCAyfSwKICAgICAgICAgMyk7Cn0K