Получение следующего объекта — различия между версиями
Free0u (обсуждение | вклад) |
Free0u (обсуждение | вклад) |
||
Строка 5: | Строка 5: | ||
== Специализация алгоритма для генерации следующей перестановки == | == Специализация алгоритма для генерации следующей перестановки == | ||
Двигаемся справа налево по элементам объекта, пока не найдем элемент, нарушающий убывающую последовательность. Обменяем его с минимальным элементом, большим нашего, стоящим правее. Далее перевернем правую часть. | Двигаемся справа налево по элементам объекта, пока не найдем элемент, нарушающий убывающую последовательность. Обменяем его с минимальным элементом, большим нашего, стоящим правее. Далее перевернем правую часть. | ||
+ | |||
+ | bool Next(vector<int> &a) { | ||
+ | int n = a.size(); | ||
+ | int pos = n - 2; | ||
+ | |||
+ | while (pos != -1 && a[pos] > a[pos + 1]) --pos; | ||
+ | if (pos == -1) return false; | ||
+ | |||
+ | int k = n - 1; | ||
+ | while (a[pos] > a[k]) k--; | ||
+ | swap(a[j], a[k]); | ||
+ | |||
+ | int l = j + 1, r = n - 1; | ||
+ | while (l < r) swap(a[l++],a[r--]); | ||
+ | return true; | ||
+ | } | ||
== Пример работы == | == Пример работы == | ||
== Ссылки == | == Ссылки == |
Версия 11:35, 28 октября 2011
Содержание
Алгоритм
Определение: |
Получение следующего объекта - это нахождение объекта, следующего за данным в лексикографическом порядке. |
Специализация алгоритма для генерации следующей перестановки
Двигаемся справа налево по элементам объекта, пока не найдем элемент, нарушающий убывающую последовательность. Обменяем его с минимальным элементом, большим нашего, стоящим правее. Далее перевернем правую часть.
bool Next(vector<int> &a) { int n = a.size(); int pos = n - 2; while (pos != -1 && a[pos] > a[pos + 1]) --pos; if (pos == -1) return false; int k = n - 1; while (a[pos] > a[k]) k--; swap(a[j], a[k]); int l = j + 1, r = n - 1; while (l < r) swap(a[l++],a[r--]); return true; }