# PBinfo #3150 – permutari_pfp – Rezolvare C++

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

## Enunț

Cerința
Se citește un număr natural n (n<16). Afișați în ordine lexicografică toate permutările mulțimii {1,2,…,n} în care elementele pare sunt puncte fixe (nu își schimbă poziția).

Date de intrare
Programul citește de la tastatură numărul n.

Date de ieșire
Programul va afișa pe ecran permutările cerute, câte una pe fiecare rând și având elementele separate prin câte un spaţiu.

Restricții și precizări

1 < n < 16

Exemplu:
Intrare

5
Ieșire

1 2 3 4 5 
1 2 5 4 3 
3 2 1 4 5 
3 2 5 4 1 
5 2 1 4 3 
5 2 3 4 1
Explicație
Se vor genera permutările în care 2 și 4 nu își modifică poziția.

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
int n;//cardinalul multimii
int X[20];//vectorul solutie
int P[20];//vector caracteristic pt pus/nepus
void afisare()
{ //afiseaza cate o solutie pe un rand
    for(int i=1;i<=n;i++)
        cout<<X[i]<<" ";
    cout<<"\n";
}
void back(int k)//k e pozitia curenta
{
    for(int i=1;i<=n;i++)
        if(!P[i])//daca i nu e pus
    { //parcurg multimea de baza (cond. externe)
        X[k]=i;//plasez element in X la poz. curenta
        P[i]=1;//i s-a pus!!!
        if(X[k]%2==1 || X[k]==k) //sa fie impar sau punct fix
        {
            if(k==n) //cond. de solutie
                afisare(); //afisare
            else back(k+1);//merg la pozitia urmatoare
        }
        P[i]=0;//i se scoate la revenire
    }
}
int main()
{
    cin>>n;
    back(1);
    return 0;
}
```

## Resurse

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