遞歸
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