Sunteți pe pagina 1din 4

METODA BACKTRACKING

SUBIECTUL I, Punctul 1
PERMUTĂRI

1. Prezentați un algoritm de generare a tuturor permutărilor, după următorul


plan de idei:
- descriere în limbaj natural și exemplificare a etapelor algoritmului ales,
pentru o mulțime de cel
puțin 3 numere;
- apreciere a complexității algoritmului ales, din punctul de vedere al duratei
de executare;
- un exemplu de aplicare a algoritmului ales în rezolvarea unei probleme
(enunț, implementare
în limbaj de programare a unei soluții, descriere a soluției).

Subiectul I
1.
Descriere în limbaj natural:
În cazul permutărilor se dă o mulțime cu n elemente și se cere să se genereze toate
permutările, adică toate posibilitățile de aranjare a elementelor multimii date.
Soluțiile se generează într-o stivă ale cărei elemente vor fi afisate.
Se începe de la primul nivel din stivă în care se trece primul element din multimea dată,
verficam dacă soluția generată de aceasta valoare este valida, adică dacă elementele nu se repetă,
iar in caz afirmativ urcăm in stiva pentru a completa stiva cu alte elemente care sunt verificate dacă
sunt valide. În cazul în care stiva este completă afișez soluția. În cazul în care pe ultimul nivel nu mai
sunt valori din multimea data neincercate se coboara in stiva la niveul anterior pentru a pune un alt
element si pentru a completa o alta solutie. Acest procedeu se repetă până când în urma unor pași
înapoi se ajunge pe primul nivel în stivă și nu mai sunt elemente neîncercate, adică stiva este vidă.
Exemplificarea algoritmului pentru {1, 2, 3}

Complexitatea algoritmului din punctul de vedere al duratei de executare este O(n2).

Enunț: Fiind dat un număr natural n și n numere naturale distincte, citite de la tastatură, să se
genereze toate permutările de n elemente.
Implementare:
#include <iostream>
using namespace std;
int st[10],n,A[10];
void citire()
{
cout<<"n="; cin>>n; // cate monede?
for(int i=1;i<=n;i++)
cin>>A[i]; // care monede? 5 bani, 50 bani, 10 bani
}
void afisare(int p)
{
for(int i=1;i<=p;i++)
cout<<A[st[i]]<<" ";
cout<<endl;
}
int solutie_valida(int p) //testeaza conditia pentru fiecare problema
//dar conditia trebuie stiuta de profesor
{
int ok=1; //presupun ca toate elementele din stiva sunt distincte
for(int i=1;i<=p-1;i++)
if(st[i]==st[p])
ok=0;
return ok;
}
int solutie_finala(int p)
{
int ok=0;
if(p==n)
ok=1;
return ok;
}
void bktr(int p)
{
int v;
for(v=1;v<=n;v++) //v ia pe rand elementele si le pune in stiva
{
st[p]=v; //pun un element in stiva
if(solutie_valida(p))
if(solutie_finala(p))
afisare(p);
else
bktr(p+1);
}
}
int main()
{
citire();
bktr(1);
return 0;
}
Descrierea soluției:
În funcția citire()...
În funcția afisare()...
În funcția solutie_valida()...
În funcția solutie_finala()...
În funcția bktr()...
În funcția main()...

Tema:
1. Prezentați un algoritm de generare a tuturor aranjamentelor, după următorul
plan de idei:
- descriere în limbaj natural și exemplificare a etapelor algoritmului ales,
pentru o mulțime de cel
puțin 3 numere;
- apreciere a complexității algoritmului ales, din punctul de vedere al duratei
de executare;
- un exemplu de aplicare a algoritmului ales în rezolvarea unei probleme
(enunț, implementare
în limbaj de programare a unei soluții, descriere a soluției).

Indicație: enunț: O clasă de elevi trebuie să programeze k examene în n zile.


Determinați toate posibilitățile de programare a examenelor știind c ă nu se pot
susține două examene în aceeași zi.

Obs: încercați să scrieți rezolvarea aranjamentelor din carte și s ă o intelegeti


ca implementarea a unei solutii și doar schimbati mesajele.

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