#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

int main() {
	const vector<int> set = { 0, 1, 2, 3 };
	const auto k = 3;

	vector<vector<int>::const_iterator> its(k, cbegin(set));
	
	do {
		transform(cbegin(its), cend(its), ostream_iterator<int>(cout), [](const auto& i) { return *i; });

		cout << endl;

		for (auto it = rbegin(its); it != rend(its) && ++*it == cend(set); ++it) *it = cbegin(set);
	} while (count(cbegin(its), cend(its), cbegin(set)) != k);
}