2012-10-22 48 views
0

我想写出一个算法来打印出'<>'给定对的所有可能组合,我试图开发一种算法来解决这个问题,但我认为这是不正确的,因为我不知道这个问题是关系到排列[NPR] &假设为5给定的输入它应该创建120个组合(5P5 = 120),但我的代码只产生81排列和组合生成算法

In my code have tried to generate all possible combinations by placing every element at every place one by one, but now I am little confused about how correct this approach is?

事情是很可能我们无法理解“制作子集/组合/排列”的真正概念(尽管理论上我知道它们是什么,如何计算它们)

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

If possible something extending or tweaking my current coding to achieve the right result would be easier for me to understand.

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; 
     } 
    } 
} 

我一直在试图理解我应该怎么做,但我'还在挣扎,任何帮助或指导将是很有益的。 三江源


From 'all combinations' i mean printing out all the possible ways given set of characters can be arranged, lets say for 2 pairs '<><>' it should be like: <><>,><<>,><<>,><><,<<>>,>><< ... ... ...

+0

你可能想看看http://www.cs.sunysb.edu/ 〜algorith/files/generate-permutations.shtml以及'递归生成排列'。 – LSerni

+2

你能举例说n = 2吗?林不知道你的意思是什么<> – jozefg

+0

Permuations和组合是完全不同的东西,需要不同的算法。你应该清楚你想要哪一个。 – john

回答

0

C++提供bool std::next_permutation(Iterator first, Iterator last)修饰的含量(第一,最后一个)是该序列中的下一个置换,返回true,如果有更多的置换,或假,如果这是最后的排列。该列表需要首先排序(使用std::sort(Iterator first, Iterator last)),排序后的列表形成第一个排列。

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

注意:由于您的数据集包含重复的项目,并非所有的排列都是可能的(有些将是其他项目的重复项)。那就是:

string : permutations 
-------:------------- 
abcd : 24 
<><> : 6 
abcdef : 720 
<><><> : 20 

如果你真的想所有的排列(包括重复),可以让您运行的排列,然后打印str[indices[0]]通过str[indices[5]]每个排列的int indices = { 0, 1, 2, 3, 4, 5 };阵列。

这可以让你深入了解你的算法和出了什么问题。也就是说,它可以作为比较你的算法的参考。

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); 
    } 

///输出

((((())))) 
(((()()))) 
(((())())) 
(((()))()) 
(((())))() 
((()(()))) 
((()()())) 
((()())()) 
((()()))() 
((())(())) 
((())()()) 
((())())() 
((()))(()) 
((()))()() 
(()((()))) 
(()(()())) 
(()(())()) 
(()(()))() 
(()()(())) 
(()()()()) 
(()()())() 
(()())(()) 
(()())()() 
(())((())) 
(())(()()) 
(())(())() 
(())()(()) 
(())()()() 
()(((()))) 
()((()())) 
()((())()) 
()((()))() 
()(()(())) 
()(()()()) 
()(()())() 
()(())(()) 
()(())()() 
()()((())) 
()()(()()) 
()()(())() 
()()()(()) 
()()()()()