#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));
	vector<bool> ns(k);

	for(int i = k - 1; its.front() != cend(set); its[i] = next(its[i], ns[i] ? -1 : 1), i = k - 1) {
		transform(cbegin(its), cend(its), ostream_iterator<int>(cout), [](const auto& i) { return *i; });

		cout << endl;

		while (i > 0 && (!ns[i] && its[i] == prev(cend(set)) || ns[i] && its[i] == cbegin(set))) {
			ns[i] = !ns[i];
			--i;
		}
	}
}