任意の数のレベルを持つ自明なアルゴリズム (多くの文字列のコピーも行います):
class StringCombinations {
public:
// filled somehow
std::vector<std::pair<char, char> > choices;
void printStrings(size_t level, std::string prefix) {
assert(level < choices.size());
if (level == choices.size() - 1) {
cout << prefix << choices[i].first();
cout << prefix << choices[i].second();
} else {
printStrings(level +1, prefix + choices[i].first());
printStrings(level +1, prefix + choices[i].second());
}
}
}
次のように呼び出されます:
StringCombinations sc;
// Set the choices table somehow.
...
sc.printStrings(0, "");
もちろん、choices テーブルは、const-reference として渡される別のメソッド パラメータにすることもできます。これには、静的メソッドを使用する方が便利な場合があります。
--
より良い代替手段 (他の回答が 3 レベルに対して提案したものを n レベルに一般化するだけ) で、再帰呼び出しをすべてコピーする必要はありません (ただし、あまり理解できません):
もちろん、直接印刷しない場合は置き換えることができcout <<
ますmystring +=
。
// all strings have size 2, 0'th char and 1'st char correspond to the choices
std::vector<std::string> choices;
void printStrings() {
for (size_t i = 0; i < static_cast<size_t>(pow(2, choices.size())); ++i) {
for (size_t j = 0; j < choices.size(); ++j) {
// Checks the bit in i (from the right) that fits the current level (j).
cout << choices[j][i & (j << x)];
// 2^#levels different values of i, ensure as many different outcomes
// (disregarding trivial choices between, e.g., 'a' and 'a'
}
}
}