#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}