我从代数课上知道,使用 ABC 和 123,我们可以对三个字母的字符串进行 216 种不同的排列,对吧?(6 x 6 x 6) 我想在 C++ 中创建一个控制台程序,以显示上述示例的所有可能排列。问题是,我什至如何开始尝试计算它们。也许:
AAA BAA CAA 1BA 2BA 3CA 1AB 2BC 3CA
等等
这真的很难问,但是我必须做些什么来确保我包含每个排列?我知道有 216 个,但我不知道如何真正经历所有这些。
任何建议将不胜感激!!!
我从代数课上知道,使用 ABC 和 123,我们可以对三个字母的字符串进行 216 种不同的排列,对吧?(6 x 6 x 6) 我想在 C++ 中创建一个控制台程序,以显示上述示例的所有可能排列。问题是,我什至如何开始尝试计算它们。也许:
AAA BAA CAA 1BA 2BA 3CA 1AB 2BC 3CA
等等
这真的很难问,但是我必须做些什么来确保我包含每个排列?我知道有 216 个,但我不知道如何真正经历所有这些。
任何建议将不胜感激!!!
如果您需要固定数量的字符串,则可以使用N
嵌套循环(在您的情况下为三个)。
string parts = "ABC123";
for (int i = 0 ; i != parts.size() ; i++)
for (int j = 0 ; j != parts.size() ; j++)
for (int k = 0 ; k != parts.size() ; k++)
cout << parts[i] << parts[j] << parts[k] << endl;
如果N
不固定,则需要更通用的递归解决方案。
使用递归真的很容易。如果您有一个包含所有六个元素的数组,那么这里是执行此操作的 java 代码。我相信您可以轻松地将其翻译成 C++。
void getAllCombinations(List<String> output, char[] chrs, String prefix, int length) {
if (prefix.length() == length) {
output.add(prefix);
} else {
for (int i = 0;i < chrs.length;i++) {
getAllCombinations(output, chrs, prefix + chrs[i], length);
}
}
return;
}
这并不完美,但它应该给你一个大致的想法。使用参数运行它:空列表、可用字符数组、空字符串和所需字符串的长度。
使用三个嵌套循环(每个字符位置一个)迭代 6 个允许字符中的每一个,很难不看到每个可能的组合都有一组相应的循环索引,并且每组合法循环索引都有一个对应的 3 个字母字符串。我收集到,循环索引和字符串之间的 1-1 对应就是您要寻找的。