Permutările lui n sunt chiar factorial de n, deci implementăm o funcție de factorial
Numărul de permutări
Cea mai ușor de implementat e varianta recursivă:
int permutari(int n){
if(n <= 1)
return 1;
return n * permutari(n-1);
}Varianta iterativă:
int permutari(int n){
int prod = 1;
for(int i = 2; i <= n; ++i)
prod *= i;
return prod;
}Generarea permutărilor
Generarea tuturor permutărilor se face folosind Backtracking, și are complexitate de timp . Pentru a ține cont de elementele deja folosite, utilizăm un vector de apariție, P[ ], și verificăm daca elementul pe care dorim sa îl utilizăm a mai fost folosit deja:
int n; // elementele vor fi 1, 2, 3, ..., n -> n este in limita a 10 elemente
int x[11], P[11];
void afis(){
for(int i = 1; i <= n; ++i)
cout << x[i] << ' ';
cout << "\n";
}
void back(int pas){ // complexitate: n * n!
for(int i = 1; i <= n; ++i)
if(!P[i]){
P[i] = 1;
x[pas] = i;
if(pas == n)
afis();
else
back(pas + 1);
P[i] = 0;
}
}
int main(){
cin >> n;
back(1);
}Cum gândești grilele de la BAC
- Permutarea mulțimii {1, 2, 3, 4}:
- Inițial, pornim de la 1,2,3,4
- Pe ultima poziție, nu mai putem pune o valoare mai mare, așa că modificăm penultima valoare de la 3, la 4 și obținem permutarea 1,2,4,3
- Pe penultima valoare nu mai putem modifica valoarea, așa că pe antepenultima o facem 3 si rezulta șirul 1,3,2,4. Acum putem din nou să modificam penultima valoare in 4 si avem permutarea 1,3,4,2
- ETC
- După acest procedeu putem să facem și backtracking pe cuvinte, ca la BAC, doar atribuim cuvintelor valori numerice