SlideShare a Scribd company logo
1 of 11
Metoda backtracking
Scop – indentificarea problemelor pentru care trebuie enumerate
toate soluțiile ,fiecare soluție fiind formată din n elemente,care
aparține unei mulțimi finite A și care trebuie să respecte anumite
condiții interne.
Acestă metoda construieste progresiv vectorul soluţiei,pornind de
la primul element si adaugînd la vector urmatoarele elemente,cu
revenire la elementul anterior din vector,in caz de insucces.
Metoda de programare
BACKTRACKING
Deseori în practică trebuie să rezolvăm probleme care au un
număr foarte mare de soluţii posibile. De cele mai multe ori
însă, nu ne interesează toate soluţiile, ci numai o parte dintre ele,
care îndeplinesc anumite condiţii specifice problemei. Pentru
astfel de probleme este indicată folosirea metodei backtracking
care evită generarea soluţilor inutile.
Definitie Backtracking este o metoda de parcurgere
sistematica a spatiului solutiilor unei probleme. Se
poate folosi pentru probleme in care trebuie sa se
genereze toate solutiile, o solutie a problemei
putand fi data de un vector (stiva alocata static)
v={x1, x2, .. , xn} ale carui elemente apartin fiecare
unei multimi finite Sk(xk∈Sk), iar asupra elementelor
uneo solutii exista anumite restrictii specifice problemei
care trebuie rezolvata numite conditii interne. Multimile
Si pot sa coincida sau nu. Pentru a gasi toate solutiile
unei astfel de probleme folosind metoda Backtracking,
procedam dupa algoritmul urmator:
Pentru a gasi toate solutiile
unei astfel de probleme folosind metoda Backtracking,
procedam dupa algoritmul urmator:
1. La fieacare pas k pornim de la o soluție partiala v=( x1,
x2, .. , xk-1) determinata pana in acel moment si
incercam sa extindem aceasta solutie adaugand un nou
element la sfârșitul vectorului.
2. Căutăm in multimea Sk , un nou element.
Forma generala a unei functii
BACKTRACKING
Vom utiliza implementarea recursiva a algoritmului
furnizat de metoda backtraking este mai naturala, deci mai
usoara. Segmentul de stiva pus la dispozitie prin apelul
functiei este gestionat automat de sistem. Revenirea la
pasul precedent se realizeaza in mod natural prin
inchiderea nivelului de stiva.
7. Daca nu mai exista niciun element neverificat in multimea Sk inseamna
ca nu mai avem nicio pozibilitate din acest moment, sa construim solutia
finala, asa ca trebuie sa modificam alegerile facute in prealabil, astfel kßk-1
si algoritmul se reia de la pasul 1.
Exemplu
1. Generarea permutarilor primelor n numere
naturale.
-vom genera solutia intr-un vector v={x1, x2, .. ,
xn} unde (xk∈Sk),
-pentru aceasta problema multimile Sk sunt identice
Sk ={1,2,3..., n}
La pasul k, selectam un element din multimea Sk.
-elementele nu au voie sa se repete, (conditia de
continuare)
 Pentru n=3
 S1=S2=S3={1,2,3}
 (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1)
Programul
Programul:
#include <iostream>
using namespace std;
int v[100],n;
void init(int k)
{ v[k]=0;} // initializare valoare pasul k, cu o valoare mai mica
// decat toate elementele multimii Sk
int succesor(int k)
{if (v[k]<n)
{v[k]=v[k]+1; return 1; } //daca mai sunt elemente neselectate
inca, il adaugam la
else return 0;}
int valid(int k)
{ for(int i=1;i<k;i++)
Continuare program
if(v[i]==v[k]) //daca exista 2 elemente identice
return 0; //elementul selectat nu este valid
return 1; } // daca trece de verificare, elementul este valid.
int solutie(int k) {return k==n;}
void tipar(int k){
for(int i=1;i<=k;i++) //afisare vector
cout<<v[i]<<" ";
cout<<endl;
}
void bk(int k){
init(k);
while(succesor(k))
if(valid(k))
{if(solutie(k)) tipar(k);
else bk(k+1);}
}
int main()
{
cout << "n="; cin>>n;
cout<<" permutari de "<<n<<endl;
bk(1);
return 0;}
Metoda back

More Related Content

Similar to Metoda back

Similar to Metoda back (6)

RH
RHRH
RH
 
metoda_backtracking22.ppt
metoda_backtracking22.pptmetoda_backtracking22.ppt
metoda_backtracking22.ppt
 
Metoda reluarii
Metoda reluarii Metoda reluarii
Metoda reluarii
 
Metoda backtracking
Metoda backtrackingMetoda backtracking
Metoda backtracking
 
9 клас
9 клас9 клас
9 клас
 
00007 backtracking
00007 backtracking00007 backtracking
00007 backtracking
 

Metoda back

  • 2. Scop – indentificarea problemelor pentru care trebuie enumerate toate soluțiile ,fiecare soluție fiind formată din n elemente,care aparține unei mulțimi finite A și care trebuie să respecte anumite condiții interne. Acestă metoda construieste progresiv vectorul soluţiei,pornind de la primul element si adaugînd la vector urmatoarele elemente,cu revenire la elementul anterior din vector,in caz de insucces.
  • 3. Metoda de programare BACKTRACKING Deseori în practică trebuie să rezolvăm probleme care au un număr foarte mare de soluţii posibile. De cele mai multe ori însă, nu ne interesează toate soluţiile, ci numai o parte dintre ele, care îndeplinesc anumite condiţii specifice problemei. Pentru astfel de probleme este indicată folosirea metodei backtracking care evită generarea soluţilor inutile.
  • 4. Definitie Backtracking este o metoda de parcurgere sistematica a spatiului solutiilor unei probleme. Se poate folosi pentru probleme in care trebuie sa se genereze toate solutiile, o solutie a problemei putand fi data de un vector (stiva alocata static) v={x1, x2, .. , xn} ale carui elemente apartin fiecare unei multimi finite Sk(xk∈Sk), iar asupra elementelor uneo solutii exista anumite restrictii specifice problemei care trebuie rezolvata numite conditii interne. Multimile Si pot sa coincida sau nu. Pentru a gasi toate solutiile unei astfel de probleme folosind metoda Backtracking, procedam dupa algoritmul urmator:
  • 5. Pentru a gasi toate solutiile unei astfel de probleme folosind metoda Backtracking, procedam dupa algoritmul urmator: 1. La fieacare pas k pornim de la o soluție partiala v=( x1, x2, .. , xk-1) determinata pana in acel moment si incercam sa extindem aceasta solutie adaugand un nou element la sfârșitul vectorului. 2. Căutăm in multimea Sk , un nou element.
  • 6. Forma generala a unei functii BACKTRACKING Vom utiliza implementarea recursiva a algoritmului furnizat de metoda backtraking este mai naturala, deci mai usoara. Segmentul de stiva pus la dispozitie prin apelul functiei este gestionat automat de sistem. Revenirea la pasul precedent se realizeaza in mod natural prin inchiderea nivelului de stiva.
  • 7. 7. Daca nu mai exista niciun element neverificat in multimea Sk inseamna ca nu mai avem nicio pozibilitate din acest moment, sa construim solutia finala, asa ca trebuie sa modificam alegerile facute in prealabil, astfel kßk-1 si algoritmul se reia de la pasul 1.
  • 8. Exemplu 1. Generarea permutarilor primelor n numere naturale. -vom genera solutia intr-un vector v={x1, x2, .. , xn} unde (xk∈Sk), -pentru aceasta problema multimile Sk sunt identice Sk ={1,2,3..., n} La pasul k, selectam un element din multimea Sk. -elementele nu au voie sa se repete, (conditia de continuare)  Pentru n=3  S1=S2=S3={1,2,3}  (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1)
  • 9. Programul Programul: #include <iostream> using namespace std; int v[100],n; void init(int k) { v[k]=0;} // initializare valoare pasul k, cu o valoare mai mica // decat toate elementele multimii Sk int succesor(int k) {if (v[k]<n) {v[k]=v[k]+1; return 1; } //daca mai sunt elemente neselectate inca, il adaugam la else return 0;} int valid(int k) { for(int i=1;i<k;i++)
  • 10. Continuare program if(v[i]==v[k]) //daca exista 2 elemente identice return 0; //elementul selectat nu este valid return 1; } // daca trece de verificare, elementul este valid. int solutie(int k) {return k==n;} void tipar(int k){ for(int i=1;i<=k;i++) //afisare vector cout<<v[i]<<" "; cout<<endl; } void bk(int k){ init(k); while(succesor(k)) if(valid(k)) {if(solutie(k)) tipar(k); else bk(k+1);} } int main() { cout << "n="; cin>>n; cout<<" permutari de "<<n<<endl; bk(1); return 0;}