#include <iostream>
#include <vector>
int main() {
using std::size_t;
size_t n = 5, k = 3;
std::vector<std::vector<size_t>> buses(k);
std::vector<size_t> bus_sizes(buses.size());
for(auto& bus_size : bus_sizes) bus_size = 3;
for(size_t n = 0; n < buses.size(); ++n) buses[n].reserve(bus_sizes[n]);
size_t start_person = 0;
auto comb = [&buses, &bus_sizes, n](size_t start_person, const auto& comb) -> void {
if(start_person == n) {
// finished!
std::cout << '|';
for(size_t i = 0; i < buses.size(); ++i) {
for(size_t j = 0; j < buses[i].size(); ++j) std::cout << buses[i][j] << ' ';
std::cout << '|';
}
std::cout << '\n';
}
else {
size_t bus = 0;
for(; bus < buses.size(); ++bus) {
if(buses[bus].size() < bus_sizes[bus]) {
buses[bus].push_back(start_person); // place person i in bus
comb(start_person + 1, comb);
buses[bus].pop_back();
}
}
if(bus == buses.size()) { /* more people than buses :( EXCEPTION!!!! */ }
}
};
comb(start_person, comb);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKaW50IG1haW4oKSB7Cgl1c2luZyBzdGQ6OnNpemVfdDsKCXNpemVfdCBuID0gNSwgayA9IDM7CgkKCXN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHNpemVfdD4+IGJ1c2VzKGspOwoJc3RkOjp2ZWN0b3I8c2l6ZV90PiBidXNfc2l6ZXMoYnVzZXMuc2l6ZSgpKTsKCWZvcihhdXRvJiBidXNfc2l6ZSA6IGJ1c19zaXplcykgYnVzX3NpemUgPSAzOwoJZm9yKHNpemVfdCBuID0gMDsgbiA8IGJ1c2VzLnNpemUoKTsgKytuKSBidXNlc1tuXS5yZXNlcnZlKGJ1c19zaXplc1tuXSk7CgoJc2l6ZV90IHN0YXJ0X3BlcnNvbiA9IDA7CgoJYXV0byBjb21iID0gWyZidXNlcywgJmJ1c19zaXplcywgbl0oc2l6ZV90IHN0YXJ0X3BlcnNvbiwgY29uc3QgYXV0byYgY29tYikgLT4gdm9pZCB7CgkJaWYoc3RhcnRfcGVyc29uID09IG4pIHsKCQkJLy8gZmluaXNoZWQhCgkJCXN0ZDo6Y291dCA8PCAnfCc7CgkJCWZvcihzaXplX3QgaSA9IDA7IGkgPCBidXNlcy5zaXplKCk7ICsraSkgewoJCQkJZm9yKHNpemVfdCBqID0gMDsgaiA8IGJ1c2VzW2ldLnNpemUoKTsgKytqKSBzdGQ6OmNvdXQgPDwgYnVzZXNbaV1bal0gPDwgJyAnOwoJCQkJc3RkOjpjb3V0IDw8ICd8JzsKCQkJfQoJCQlzdGQ6OmNvdXQgPDwgJ1xuJzsKCQl9CgkJZWxzZSB7CgkJCXNpemVfdCBidXMgPSAwOwoJCQlmb3IoOyBidXMgPCBidXNlcy5zaXplKCk7ICsrYnVzKSB7CgkJCQlpZihidXNlc1tidXNdLnNpemUoKSA8IGJ1c19zaXplc1tidXNdKSB7CgkJCQkJYnVzZXNbYnVzXS5wdXNoX2JhY2soc3RhcnRfcGVyc29uKTsgLy8gcGxhY2UgcGVyc29uIGkgaW4gYnVzCgkJCQkJY29tYihzdGFydF9wZXJzb24gKyAxLCBjb21iKTsKCQkJCQlidXNlc1tidXNdLnBvcF9iYWNrKCk7CgkJCQl9CgkJCX0KCQkJaWYoYnVzID09IGJ1c2VzLnNpemUoKSkgeyAvKiBtb3JlIHBlb3BsZSB0aGFuIGJ1c2VzIDooIEVYQ0VQVElPTiEhISEgKi8gfQoJCX0KCX07CgkJCgljb21iKHN0YXJ0X3BlcnNvbiwgY29tYik7Cn0=