查找ABC和123的三字母字符串的排列数

时间:2012-04-09 01:09:20

标签: visual-c++ permutation

我从代数课上知道,对于ABC和123,我们可以为三个字母的字符串制作216种不同的排列,对吧? (6 x 6 x 6)我想用C ++创建一个控制台程序,它为上面的例子显示了可能的排列。问题是,我怎么会开始尝试计算它们。也许:

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

这真的很难问,但是我需要做些什么来确保我包含每个排列?我知道有216个,但我不知道如何真正去完成所有这些。

任何建议都将非常感谢!!!

3 个答案:

答案 0 :(得分: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未修复,则需要更通用的递归解决方案。

答案 1 :(得分: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;
}

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

答案 2 :(得分:0)

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