Sunteți pe pagina 1din 2

Metoda backtracking

Cum se procedeaza?  Reprezentare


se pleaca de la primul etaj k=1;
din fata usi x[k]=0;
atata timp cat ne aflam pe un etaj,k while(k>0)
repetam {
do {
ne intrebam daca mai sunt raioane pe etajul k
succ(x,k,as);
daca Da atunci if(as)
se verifica daca ne convine ce contine raionul valid(x,k,ev);
care urmeaza }while(as && !ev);
atata timp cat(mai sunt raioane si nu a gasit ce ne place); If(as)
daca am gasit atunci If(k==5)
daca le-am luat pe toate atunci afis(x,k);
se afiseaza Else {
altfel k=k+1;
se merge la etajul x[k]=0;
urmator }
Else
in fata usi
k=k-1;
altfel }
se coboara la etajul de jos
Cum ne dam seama daca mai sunt raioane la etajul k? Void succ(sir x, int k, int &as)
Daca numarul raionului de la etajul k este mai mic decat 10 {
Atunci If(x[k]<10) {
Mai sunt raioane pe etajul k as=1;
Si mergem la raionul urmator x[k]=x[k]+1;
Altfel }
Nu mai sunt raioane pe etajul k Else as=0;
}
Cum se realizeaza afisarea? Void afis(sir x,int k)
Pentru i de la 1 la k {
Se afiseaza x[i] Int i;
Cursorul se trece la linia urmatoare For(i=1;i<=k;i++)
Cout<<x[i]<<” “;
Cout<<endl; }
Observatie. Presupunem ca orice alegere de haine ne convine. Void valid(int &ev)
{
ev=1;
}
4.3 EXEMPLE DE FUNCTII VALID POSIBILE
1. Nu exista conditii intre componentele vectorului solution Void valid(int &ev)
{
ev=1;
}
2.Componentele vectorului solutie trebuie sa fie distincte. Void valid(sir x,int k, int &ev)
Trebuie aratat ca: xk!=xi pentru i=1…k-1. {
Se procedeaza astfel: Int i;
- se presupune ca xk este diferit de toate elementele din fata sa; ev=1;
- se parcurg indici 1…k-1 cu i: for(i=1;i<=k-1;i++)
- daca xk nu este != de xi, atunci if(!(x[k]!=x[i]))
Presupunerea este falsa. ev=0;
}
3.Componentele vectorului solutie trebuie sa fie sortate crescator. Void valid(sir x, int k, int &ev)
Trebuie aratat ca: xk>=xk-1 pentru k>=2. {
Se procedeaza astfel: ev=1;
- se presupune ca propozitia este adevarata; if((k>=2) && !(x[k]<=x[k-1]))
- daca k>=2 si xk<xk-1 atunci ev=0;
Propozitia este falsa. }
4.Componentele vectorului solutie trebuie sa fie sortate descrescator. Void valid(sir x, int k, int &ev)
Trebuie aratat ca: xk<=xk-1 pentru k>=2. {
Se procedeaza astfel: ev=1;
- se presupne ca propozitia este adevarata; if((k>=2) && !(x[k]<=x[k-1]))
- daca k>=2 si xk>xk-1, atunci ev=0;
Propozitia este falsa. }
5.Componenta vectorului solutie cu numarul de ordine p trebuie sa Void valid(sir x,int k,int &ev)
verifice o conditie. {
Trebuie aratat ca: xp verifica o conditie. ev=1;
Se procedeaza astfel: if((k==p) && !(x[k] verifica conditia))
- se presupue ca propozitia este adevarata; ev=0;
- daca k=p si xk nu verifica conditia, atunci }
Propozitia este falsa.
Observatie. Daca se lucreaza asupra elementelor multimii A={a1,a2,…am}, se scrie a[x[i]] in loc de x[i] pentru orice i.

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