2013-04-16 108 views
0

我正在尝试使用for循环来替换我通常使用的递归,但是我发现它比我想象的要困难。谁能告诉我该怎么做?谢谢!没有递归的排列?

例如,给定的2的向量,1,3,应该有6个排列:

1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 

载体低于...

vector<int> simple; 
simple.push_back(2); 
simple.push_back(1); 
simple.push_back(3); 

编辑:从改变的顺序1 2 3随机顺序2 1 3

+0

你尝试过什么吗? –

+0

使用['std :: next_permutation'](http://en.cppreference.com/w/cpp/algorithm/next_permutation)。 –

+0

如果你想使用boost:http://www.boost.org/doc/libs/1_38_0/libs/iterator/doc/permutation_iterator.html – citykid

回答

2

我猜你正在寻找std::next_permutation()

#include <iostream> 
#include <algorithm> 
#include <vector> 

int main() 
{ 
    std::vector<int> simple{1, 2, 3}; 

    do 
    { 
     for (auto e : simple) { std::cout << e << " "; } 
     std::cout << std::endl; 
    } 
    while (next_permutation(simple.begin(), simple.end())); 
} 

这是live example

如果你不想开始一个排序的载体,可以使用std::next_permutation()方式如下:

#include <iostream> 
#include <algorithm> 
#include <vector> 

constexpr int factorial(int i) 
{ 
    return i == 0 ? 1 : i * factorial(i-1); 
} 

int main() 
{ 
    std::vector<int> simple{3, 1, 2}; 

    for (int i = 0; i < factorial(simple.size()); i++) 
    { 
     std::next_permutation(simple.begin(), simple.end()); 
     for (auto e : simple) { std::cout << e << " "; } 
     std::cout << std::endl; 
    } 
} 

这里是一个live example

注意,如果向量的大小在编译时是已知的,似乎是从你的榜样的情况下,你可以使用的std::array代替std::vector,如图this live example

+0

看来next_permutation需要输入顺序? – Arch1tect

+0

@ Arch1tect:有点,你说得对。如果你想在'next_permutation'返回'false'之前找到所有的排列,那么是的。 –

+0

我只用1 2 3作为例子,矢量不一定要按顺序。任何想法如何解决在这种情况下? :) – Arch1tect