1

我从代数课上知道,使用 ABC 和 123,我们可以对三个字母的字符串进行 216 种不同的排列,对吧?(6 x 6 x 6) 我想在 C++ 中创建一个控制台程序,以显示上述示例的所有可能排列。问题是,我什至如何开始尝试计算它们。也许:

AAA BAA CAA 1BA 2BA 3CA 1AB 2BC 3CA

等等

这真的很难问,但是我必须做些什么来确保我包含每个排列?我知道有 216 个,但我不知道如何真正经历所有这些。

任何建议将不胜感激!!!

4

3 回答 3

3

如果您需要固定数量的字符串,则可以使用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不固定,则需要更通用的递归解决方案。

于 2012-04-09T01:14:28.423 回答
3

使用递归真的很容易。如果您有一个包含所有六个元素的数组,那么这里是执行此操作的 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;
}

这并不完美,但它应该给你一个大致的想法。使用参数运行它:空列表、可用字符数组、空字符串和所需字符串的长度。

于 2012-04-09T01:24:29.323 回答
0

使用三个嵌套循环(每个字符位置一个)迭代 6 个允许字符中的每一个,很难看到每个可能的组合都有一组相应的循环索引,并且每组合法循环索引都有一个对应的 3 个字母字符串。我收集到,循环索引和字符串之间的 1-1 对应就是您要寻找的。

于 2012-04-09T01:15:32.533 回答