#include <iostream> #include <set> #include <vector> #include <cmath> using namespace std; using sets = vector<vector<int>>; void output(const vector<int>& v) { cout << "{"; for (int i = 0; i < v.size(); ++i) { if (i > 0) cout << ", "; cout << v[i]; } cout << "}\n"; } void rec(int index, const sets& s, vector<int>& v) { for (int next : s[index]) { v[index] = next; if (index + 1 == s.size()) { output(v); } else { rec(index+1, s, v); } } } void non_rec(const sets& s) { int q = s[0].size(); int k = s.size(); vector<int> v(q); int cnt = (int)pow(q, k); for (int i = 0; i < cnt; ++i) { int tmp = i; for (int j = 0; j < k; ++j) { v[j] = s[j][tmp % q]; tmp /= q; } output(v); } } int main() { sets s = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int q = s[0].size(); vector<int> v(q); cout << "recursive\n"; rec(0, s, v); cout << "non_recursive\n"; non_rec(s); return 0; }
Standard input is empty
recursive
{1, 4, 7}
{1, 4, 8}
{1, 4, 9}
{1, 5, 7}
{1, 5, 8}
{1, 5, 9}
{1, 6, 7}
{1, 6, 8}
{1, 6, 9}
{2, 4, 7}
{2, 4, 8}
{2, 4, 9}
{2, 5, 7}
{2, 5, 8}
{2, 5, 9}
{2, 6, 7}
{2, 6, 8}
{2, 6, 9}
{3, 4, 7}
{3, 4, 8}
{3, 4, 9}
{3, 5, 7}
{3, 5, 8}
{3, 5, 9}
{3, 6, 7}
{3, 6, 8}
{3, 6, 9}
non_recursive
{1, 4, 7}
{2, 4, 7}
{3, 4, 7}
{1, 5, 7}
{2, 5, 7}
{3, 5, 7}
{1, 6, 7}
{2, 6, 7}
{3, 6, 7}
{1, 4, 8}
{2, 4, 8}
{3, 4, 8}
{1, 5, 8}
{2, 5, 8}
{3, 5, 8}
{1, 6, 8}
{2, 6, 8}
{3, 6, 8}
{1, 4, 9}
{2, 4, 9}
{3, 4, 9}
{1, 5, 9}
{2, 5, 9}
{3, 5, 9}
{1, 6, 9}
{2, 6, 9}
{3, 6, 9}