# PBinfo #2778 – next_perm – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Scrieți definiția completă a subprogramului C++:

void next_perm(int n, int P[])
Subprogramul primește 2 parametri:


n – prin care primește un număr natural
P – prin care primește un tablou unidimensional cu n elemente ce reprezintă o permutare a mulțimii {1,2,...,n}.

Subprogramul va returna tot în parametru P următoarea permutare din punct de vedere lexicografic.

Restricții și precizări

2 ≤ n ≤ 100000;
elementele tabloului unidimensional P sunt indexate de la 1;
pentru datele de intrare testate există întotdeauna permutare următoare;
se recomandă evitarea folosirii unor funcții predefinite care realizează operația cerută.

Exemplu:
Dacă pentru n=5 avem permutarea P={2,1,5,4,3} subprogramul va returna: P={2,3,1,4,5}.

Important
Soluția propusă va conține doar definiția subprogramului cerut. Prezența în soluție a altor instrucțiuni poate duce erori de compilare sau de execuție care vor avea ca efect depunctarea soluției.

## Cod sursă C++

```cpp
void next_perm(int n, int P[])
{
    int i, j, k, Min;
    /// parcurgem permutarea de la dreapta la stanga pt. a gasi pozitia k
    /// astfel incat P[k] < P[k+1], iar P[k+1] > P[k+2] > ... > P[n]
    for(k = n-1; k > 0; k--)
        if (P[k] < P[k+1]) break;
    /// cautam cel mai mic element P[i] > P[j], cu i=k+1,...,n
    Min = P[k+1], j = k+1;
    for(i = k+1; i <= n; i++)
        if (P[i] < Min && P[i] > P[k]) Min = P[i], j = i;
    ///iterschimbam P[k] cu P[j]
    swap(P[k], P[j]);
    /// inversam ultimele n-k elemente din permutare
    i = k+1, j = n;
    while ( i < j ) {
        swap(P[i], P[j]);
        i++, j--;
    }
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2778)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2778/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2778/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
