2015-09-06 2 views
0

Есть ли способ распечатать все перестановки, опуская перестановки, которые уже встречаются в обратном порядке, используя next_permutation в C++. Например, после печати {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.

Смежные вопросы