递归
using sets = vector<vector<int>>;
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);
}
}
}
int main() {
sets s = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int q = s[0].size();
vector<int> v(q);
rec(0, s, v);
return 0;
}
非递归
主要思想是,每一个选择可以由许多在碱基q
编码数字系统。而你所需要做的就是遍历所有基数q
号码与length <= n
。该号码的每个数字都是相应组中的索引。
例如,我们有2组3个数字。你需要遍历{00, 01, 02, 10, 11, 12, 20, 21, 22}
。
using sets = vector<vector<int>>;
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}};
non_rec(s);
return 0;
}
http://ideone.com/V58I7W
* “的事情是,K,Q可能会有所不同,所以我不能嵌套的for循环使用。” *为什么呢? – CinCout
@CinCout我可能会错过一些东西,但我不知道有什么方法可以根据需要生成尽可能多的嵌套循环。就我而言,我需要k个嵌套循环。请解释。 – mgus
'k'和'q'各不相同,但已知对不对?在这个例子中,你给了,你将总共有27套。我只需要循环运行'q^k'次。有什么问题? – CinCout