Sunteți pe pagina 1din 3

Generarea permutrilor

Enun: Se citete un numr natural n. Ce cere s se genereze toate permutrile mulimii {1, 2,,n}

Dac n=3, mulimile A
1 =
A
2 =
A
3
={1, 2, 3}
Soluiile ar fi: 123
132
213
231
312
321 A
3

A
2



A
1
Observaie important
Se observ, c elementele mulimilor sunt n ordine strict cresctoare i consecutive. Aadar modul
de alegere din mulime nu este aleatoriu ci se face n funcie de ordinea elementelor.

Exemplul 2.
Pentru enunul de la exemplul anterior, generm, cu ajutorul stivei, soluiile prim metoda
backtracking.
pas1 pas 2 pas3 pas 4
n=3





11

pas 1
Se ia primul element din mulimea A
1
i se pune pe nivelul 1 al stivei. Nu exist deocamdat nici o
restricie deoarece exist permutri ce ncep cu 1. Se trece la completarea urmtorului nivel al stivei.
pas 2
Se ia primul element din mulimea A
2
i se pune pe nivelul 2 al stivei. Se observ c valoarea 1 a mai fost
introdus n vectorul soluie, pe nivelul anterior, i, n acest caz valoarea 1 nu poate fi ataat la vectorul
soluie. Aadar, se ia urmtorul element din mulimea A
2
, adic 2. Se constat c poate fi introdus n
vectorul soluie. Se trece la completarea urmtorului nivel al stivei.
pas 3
Se ia primul element din mulimea A
3
i se pune pe nivelul 3 al stivei. Se observ c valoarea 1 a mai fost
introdus n vectorul soluie, pe nivelul anterior, i, n acest caz valoarea 1 nu poate fi ataat la vectorul
soluie. Aadar, se ia urmtorul element din mulimea A
3
, adic 2. La fel ca valoarea 1, 2 nu poate fi
introdus n stiv. Se trece la urmtorul element din mulime, 3. Se constat c poate fi introdus n vectorul
soluie.
S-au completat toate nivelele stivei i deci soluia este 1 2 3.
pas 4
Pentru nivelul 3 al stivei nu mai exist o alt valoare din mulimea A
3
ce poate fi adugat. Din acest
motiv, se revine la nivelul 2 al stivei (napoi) i se completeaz cu urmtoarea valoare din mulimea A
2
ce nu
a fost utilizat, adic 3. Se trece la completarea urmtorului nivel al stivei.
1 1
1
1
2
1 1 1
1
2 2
2
2
3
1
3
Procedeul se repet pn cnd nu se mai poate introduce o valoare pe nivelul 1 al stivei. n acel moment
s-au generat toate soluiile problemei.

Algoritmul

Se poate constui destul de uor urmtorul algoritm:
k=1; // nivelul stivei
st[k]=x; // iniializez nivelul k al stivei cu o valoare x egal cu predecesorul primei valori din A
k

while (k > 0) // exist nivele necompletate i nu s-au generat toate soluiile
{ q=0; // presupun c nu s-a gsit elementul ce poate fi adugat n st[k]
while ( !q && exist element succesor al lui st[k] netestat n multimea A
k
)
{ st[k]= succesor;
if (valid (k)) q=1; // se verific dac se poate aduda la soluie
}
if( !q) k=k-1; // se coboar n stiv
else
if ( solutie(k)) // s-a ajuns la soluie
scrie soluia
else
{ k=k+1; // se trece la nivelul urmtor i se reia procedeul
st[k]=x;
}
}
Exemplu: permutri

k=1; // nivelul stivei
st[k]=0; // iniializez nivelul k al stivei cu o valoare x egal cu predecesorul primei valori din A
k

while (k > 0)
{ q=0;
while ( !q && (st[k]+1<n) )
{ st[k]++;
if (valid (k)) q=1; // se verific dac se poate aduda la soluie
}
if( !q) k=k-1; // se coboar n stiv
else
if ( k = n) // s-a ajuns la soluie
for (int i=1; i<=n; i++) cout<< st[i]
else
{ k=k+1; // se trece la nivelul urmtor i se reia procedeul
st[k]=0;
}
}

---------------------- funcia valid-----------------------------
int valid(int k)
{ int q=1; // presupun c st[k] poate fi adugat la soluie
for (int i=1; i<k; i++) // verific dac st[k] a mai fost adugat la soluie
if(st[k]== st[k-1]) q=0;
return q;
}


Aplicaie:
Pentru a determina toate modalitile de a scrie pe 9 ca sum de numere naturale nenule distincte,
un elev folosete metoda backtracking genernd, n aceast ordine, toate soluiile 1+2+6, 1+3+5, 1+8,
2+3+4, 2+7, 3+6, 4+5. Aplicnd exact aceeai metod, el determin soluiile pentru scrierea lui 12. Cte
soluii de forma 3+ exist?
a. 7 b. 2 c. 1 d. 4

S-ar putea să vă placă și