Sunteți pe pagina 1din 4

TEHNICA BACKTRACKING

Proiect realizat de
Clasa
Liceul
Profesor coordonator

o Generarea permutarilor
Fie multimea A={1,2,3…,n}. Generati toate permutarile multimii folosind metoda Backtracking.

o Conditii permutari ~elementele nu se repeta


Pt n=4 ~ solutia cuprinde n elemente
o solutiile se construiesc pe un vector de tip stiva
o as-(avem succesori)-este variabila prin care se verifica daca se
poate adauga un nou element vectorului.
o ev-(este valid)-este variabila care verifica respectarea conditiilor.
o tinand cont ca multimea A cuprinde toate numerele naturale in
ordine crescatoare de la 1 la n, n reprezinta ultimul numar al
multimii si in acelasi timp numarul de elemente.
o primul element se seteaza pe 0
o elementele vectorului v incep de la indicele 0.
o reprezinta structura repetitiva in care se afiseaza si se genereaza
solutiile. Aceasta se repeta cat timp elementul curent k se afla in
interiorul vectorului.
o dupa aceea, programul intra intr-o structura repetitiva de tip
do...while care se repeta cat timp vectorul nu respecta
conditiile. Astfel, acesta aduna succesiv 1 elementului curent k
pana acesta respecta conditiile sau depaseste nr de elemente
din multimea citita.
o deoarece nu avem momentan succesor pana la incrementarea
elementului curent v[k]
o deoarece nu stim momentan ca elementul curent( care va fi
obtinut prin incrementarea lui v[k]) va respecta conditiile
prezentate mai sus, deci presupunem ca elementul respecta
conditiile din start ev=1
o se incrementeaza elementul curent pt a se obtine o noua solutie
distincta
o daca elementul este cuprins in multimea citita, atunci variabila
as este setata pe 1.
o In cazul in care avem succesori, se verifica prin intermediul unei
structuri repetitive de tip for daca vectorul respecta conditiile
prezentate. Daca aceasta nu respecta conditiile, variabila ev este
#include <iostream> setata pe 0.
o do...while alege o cifra noua pentru permutare
using namespace std;

int main()
{
int v[10],k,i,as,ev,n;

cin>>n;

v[0]=0;
k=0;
while(k>=0)
{
do
{

o verificam daca am ales o cifra buna.


o verificam daca k a ajuns sa fie indeajuns de lung pentru a
avea o solutie
as=0;
o da cout la solutie

ev=1;

v[k]++; o daca k nu este suficent de lung pentru a avea o solutie,


inseamna ca mai avem nevoie de cifre, deci crestem k si

if(v[k]<=n) punem v[k] pe 0.

as=1;
if(as==1)
for(i=0;i<k;i++)
if(v[k]==v[i]) o daca nu intram deloc in if(as==n-1), atunci inseamna ca nu
ev=0; am gasit o cifra noua pentru solutie si tot scadem k pentru a
} schimba alta si posibil a gasi alta solutie.
while(ev==0 && as==1);
if(as==1)
if(k==n-1)
{
for(i=0;i<=k;i++)
cout<<v[i];
cout<<endl;
}
else
{
k++;
v[k]=0;
}

else
k--;

}
}

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