Sie sind auf Seite 1von 2

Problema aranjamentelor de n elemente luate cate p .

#include <iostream.h>
int i,n,p,k,as,ev;
int st[100];
/*
daca n= si p =!, se vor a"isa urmatoarele solutii #

1 !
1
! 1
!
1
!
*/
// aran$amentele sunt permutari de lun%ime p &
// rutina de initiali'are #
// orice valoarea de pe un nivel k al stivei se initiali'ea'a cu valoarea de start 0
// rutina de %enerare a unei noi valori ( succesor ) #
// pe orice nivel al stivei pot e*ista valori cuprinse intre 1 si n
// rutina de veri"icare a validitatii unei solutii partiale #
//elementele a"late pe nivele di"erite tre+uie sa "ie di"erite
// rutina de veri"icare a solutiei "inale #
// avem solutie daca am %enerat corect doar p elemente ( deci daca k==p )
// rutina de tiparire a unei solutii , in care se tipareste stiva solutie &
int main()
,
cout<<-.ro+lema aran$amentelor/n-;
cout<<-0ati valoarea lui n=-;
cin>>n; // citeste numarul elementelor multimii 1
do
,
// re%ula antiprost & , daca am introdus din %reseala
// valoarea lui p mai mare decat valoarea lui n, sa citeasca
// inca o data valoarea lui p , pina cand valoarea lui p este corect introdusa ....
cout<<-0ati valoarea lui p (<=n) =-; cin>>p;
23hile(n<p); // repeta citirea lui p , pina cand valoarea lui p este <=n
k=1; // ne po'itionam pe primul nivel al stivei solutie
st[k]=0; // initiali'am valoarea de pe nivelul respectiv cu valoarea de start
3hile(k>0) // cat timp stiva este nevida
,
do
,
i"(st[k]<n) // daca se poate %enera un succesor pe nivelul k
,
Prof. Buzatu Giani Viorel - Metode si tehnici de programare Aranjamente .
Problema aranjamentelor de n elemente luate cate p .
as=1; // pot %enera o noua valoare pe nivelul k , care este valoarea veche 41
st[k]44; // %enerea'a valoarea ...
2
else as=0; // spune ca n5ai putut %enera o noua valoare

i"(as==1) // daca ai putut %enera o noua valoare
//veri"ica validitatea ei in cadrul solutiei partiale
,
ev=1; // presupun ca este o solutie partiala corecta
"or(i=1;i<k;i44) // veri"ic daca valoarea pe care am %enerat5o este unica &
i"(st[k]==st[i]) ev=0; // daca se mai %aseste cel putin inca o data ,
// valoarea %enerata nu este valida
2
2
3hile((as==1)66(ev==0)); // repeta procedeul de mai sus cat timp am %enerat o
//valoare si aceasta nu este valida
i"(as==1) // daca s5a %enerat o valoare
,
i"(k==p) // am a$uns la solutie, daca am %enerat doar p nivele, a"isam doar
// primele p elemente din stiva solutie
,
"or(i=1;i<=k;i44)cout<<st[i]<<- -; // tipareste solutia inte%ral, in ca'ul
// nostru stiva solutie
cout<<-/n-; // treci la rand nou dupap "iecare solutie tiparita &
2
else // nu s5a a$uns la solutie , se trece pe randul imediat superior
// si se "ace curat&
,
k44; // mer%i pe nivelul imediat superior ....
st[k]=0; // pune valoarea de start , acolo ...
2
2
else k55; // n5am putut %enera un succesor , treci pe nivelul imediat in"erior ....
2
2
Prof. Buzatu Giani Viorel - Metode si tehnici de programare Aranjamente .

Das könnte Ihnen auch gefallen