C++ 排列与排列;组合生成算法

C++ 排列与排列;组合生成算法,c++,algorithm,set,permutation,combinations,C++,Algorithm,Set,Permutation,Combinations,我想写下一个算法来打印出给定对“”的所有可能组合,我曾尝试开发一个算法来解决这个问题,但我认为这是不正确的,因为我确实意识到这个问题与置换[nPr]有关&假设给定输入为5,它应该创建120个组合(5P5=120)但我的代码只生成了81 在我的代码中,我试图通过将每个元素逐个放置在每个位置来生成所有可能的组合,但现在我对这种方法的正确性有点困惑了。 事情很可能是我无法理解“生成子集/组合/置换”的真正概念(尽管理论上我知道它们是什么以及如何计算它们) 我不是在寻找一个完整的最终“填鸭式代码”,而是

我想写下一个算法来打印出给定对“”的所有可能组合,我曾尝试开发一个算法来解决这个问题,但我认为这是不正确的,因为我确实意识到这个问题与置换[nPr]有关&假设给定输入为5,它应该创建120个组合(5P5=120)但我的代码只生成了81

在我的代码中,我试图通过将每个元素逐个放置在每个位置来生成所有可能的组合,但现在我对这种方法的正确性有点困惑了。

事情很可能是我无法理解“生成子集/组合/置换”的真正概念(尽管理论上我知道它们是什么以及如何计算它们)

我不是在寻找一个完整的最终“填鸭式代码”,而是一个可以解释我“应该做什么”的东西,从中我可以提炼出步骤,理解概念,并可以开发自己的代码

如果可能,扩展或调整我当前的编码以获得正确的结果对我来说会更容易理解。

void permute()
{
    string str=”<><><>”;
    char buck=' ';
for(int a=0;a<str.length()-1;a++)
    {
        for(int b=0;b<str.length()-1;b++){
            cout<<str<<endl;
            buck=str[b];
            str[b]=str[b+1];
            str[b+1]=buck;
        }
    }
}
void permute()
{
字符串str=“”;
char buck='';

for(int a=0;aC++提供了
bool std::next_排列(Iterator first,Iterator last)
,它将(first,last)的内容修改为序列中的下一个排列,如果有更多排列,则返回true;如果这是最后一个排列,则返回false。需要首先对列表进行排序(使用
std::sort(迭代器优先,迭代器最后)
),排序后的列表形成第一个排列

您可以使用
str.begin()
str.end()
与这些算法交互

注意:因为您的数据集包含重复的项,所以并非所有的排列都是可能的(有些是其他项的重复)。即:

string : permutations
-------:-------------
abcd   : 24
<><>   : 6
abcdef : 720
<><><> : 20
字符串:排列
-------:-------------
abcd:24
: 6
abcdef:720
: 20
如果您确实想要所有排列(包括重复排列),您可以使用
int index={0,1,2,3,4,5};
数组运行排列,然后通过
str[index[5]]
为每个排列打印
str[index[0]]


这可以让您深入了解您的算法以及出错的原因。也就是说,它可以作为比较您的算法的参考。

根据我的测试,它有42种解决方案:

    function placeBrackets(n)
    {
        var placeBracketsRecur = function(prefix, remainingOpen, remainingClosed)
        {
            if(remainingClosed == 0)
            {
                document.write(prefix + "<br/>");
                return;
            }

            if(remainingOpen > 0)
            {
                placeBracketsRecur(prefix + "(",  remainingOpen - 1, remainingClosed);
            }

            if(remainingOpen < remainingClosed)
            {
                placeBracketsRecur(prefix + ")",  remainingOpen, remainingClosed - 1);
            }
        }

        placeBracketsRecur("", n, n);
    }

你可能想看看“递归生成置换”。你能举个例子说n=2吗?我不确定你所说的所有置换组合的确切意思,而且组合是不同的东西,需要不同的算法。你应该弄清楚你想要哪一个。是
@Maven:那你是问r是一个标准的排列。有很多关于它的细节。你的编辑澄清了它与加泰罗尼亚数字无关。
((((()))))
(((()())))
(((())()))
(((()))())
(((())))()
((()(())))
((()()()))
((()())())
((()()))()
((())(()))
((())()())
((())())()
((()))(())
((()))()()
(()((())))
(()(()()))
(()(())())
(()(()))()
(()()(()))
(()()()())
(()()())()
(()())(())
(()())()()
(())((()))
(())(()())
(())(())()
(())()(())
(())()()()
()(((())))
()((()()))
()((())())
()((()))()
()(()(()))
()(()()())
()(()())()
()(())(())
()(())()()
()()((()))
()()(()())
()()(())()
()()()(())
()()()()()