2015-09-06 72 views
0

有沒有什麼辦法可以打印所有的排列,省略了在C++中使用next_permutation以相反順序排列的排列。例如,打印{1, 2, 3, 4}後,它不應打印{4, 3, 2, 1}C++ next_permutation沒有以相反的順序排列

+0

我不知道我理解你的問題。 '1,2,3,4'是第一個詞典排列,如果你使用'next_permutation',它會打印1,2,4,3',而不是'4,3,2,1'。也許你在問[組合](http://marcodiiga.github.io/permutations-and-combinations/)? –

+1

雖然對於Python,[這個問題](http://stackoverflow.com/q/960557/2675154)上的答案提供了一些很好的解釋。 – honk

回答

2

只要在排列的第一個元素是字典順序不是最後一個元素少,你不會得到逆轉時,這將是重複的任意排列:

std::vector<int> v {1, 2, 3, 4}; 

do { 
    if (v.front() < v.back()) { // first less than last 
     std::copy(v.begin(), v.end(), 
        std::ostream_iterator<int>(std::cout, " ")); 
     cout << '\n'; 
    } 
} 
while (std::next_permutation(v.begin(), v.end())); 
0

當你產生遞增序列順序排列您可以簡單地省略其最後一項小於其第一項的任何排列(其反向已經列出)。

由於ň項目置換的數量是ñ!,消除一半不會在大O性能影響。