Sunteți pe pagina 1din 4

Laborator 4

METODA BACKTRACKING (partea I - relatii intre elemente)


I. Repere teoretice

Cnd ar putea fi o metod bun?


Se cer toate soluiile; soluiile sunt combinaii, selecii de date care respect
anumite criterii.
Cnd se poate aplica?
O soluie se poate reprezenta sub form de tablou (tablou unidimensional cu
elemente simple sau structuri, tablou multidimensional)
Fiecare element al tabloului ia valori ntr-o mulime finit.
Abordare:
- O soluie se memoreaz ntr-un tablou, x, n care x 1,x2, xk-1 reprezint un
prefix care respect criteriile impuse
- Pentru o poziie k, se alege urmtorul element netestat din mulimea
valorilor posibile pentru acesta:
o dac el respect criteriile impuse (adugarea lui la soluie nu
contravine acestora) se trece la poziia urmtoare, k+1
o dac el nu respect condiiile impuse, se caut o alt valoare
netestat pentru aceeai poziie, k
o dac s-au testat toate valorile posibile pentru poziia k, se revine la
poziia anterioar, k-1, i se reia procedeul
- Dac s-a gsit o soluie final, se afieaz/prelucreaz, apoi se continu
algoritmul, pentru aceeai poziie, k.
- Algoritmul incepe cu gasirea unei valori posibile pentru prima pozitie si se
ncheie cnd s-au testat toate valorile posibile pentru prima poziie;
Repere pentru rezolvare:
ntrebri necesare
Efect asupra algoritmului
1 Ce reprezint o singur soluie?
Reprezentare ca vector:
Ce reprezint un element al soluiei, x1, x2, ..
x[k]?
Ce reprezint indicele k?
2. Care este mulimea valorilor pe care le Varianta recursiv
void BKT (int k, int x[])
poate lua x[k]?
Muliimea trebuie s fie format din { for(int i=p;i<=u;i++)
{ x[k]=i;
elemente consecutive, iar dac nu sunt
if(EstePrefixValid(k,x))
consecutive, se memoreaz valorile
if(EsteSolutie(k,x))
posibile ntr-un vector i se opereaz
Tipar(k,x)
cu indicii acestuia!
else
BKT(k+1,x);
x[k]{p, p+1, ., u}
}
}
Varianta iterativ
void BKT (int x[])
{ int k;
k=1;
x[k]=p-1;
while(k>0)
if(x[k]<u)
{ x[k]++;
if(EstePrefixValid(k,x))
if(EsteSolutie(k,x))
Tipar(k,x)
else
{ k++; x[k]=p-1;}

}
else k--;

}
Stiind ca x1,x2,xk-1 este un prefix int EstePrefixValid(int k, int x[]);
valid (respect deja criteriile impuse),
ce condiii trebuie s ndeplineasc xk,
astfel incat prefixul s fie valid?
Obs se verifica aceste conditii doar
pentru xk, nu si pentru celelalte
elemente, deja testate!
Ce conditii trebuie sa indeplineasca int EsteSolutie (int k, int x[]);
prefixul pentru a fi solutie finala?
Obs de obicei este sufficient sa
verificam daca vectorul a fost completat
(daca toate solutiile au aceeasi
dimensiune)

II. Aplicaii:
1. Problema permutarilor
Sa se gaseasca toate posibilitatile de a aseza cele N elemente ale multimii {1,2,,N};
conteaza ordinea de asezare a elementelor in grupa.
Repere:
a) O solutie este o posibilitate de a aseza cele n elemente
x1, x2, xN
x[k] elementul de pe pozitia k in aceasta asezare
b) x[k] este un element al multimii date, deci x[k]{1,2,N}
c) Validare: elementele trebuie sa fie distincte: pentru x[k]x[i], pentru orice i=1k-1
d) Solutie finala: k=N
2. Problema aranjamentelor
Sa se gaseasca toate posibilitatile de a aseza cele N elemente ale multimii {1,2,,N} in
grupe de cate P elemente; conteaza ordinea de asezare a elementelor in grupa.
Repere:
a) O solutie este o posibilitate de a aseza cele P elemente
x1, x2, xP
x[k] elementul de pe pozitia k in aceasta asezare
b) x[k] este un element al multimii date, deci x[k]{1,2,N}
c) Validare: elementele trebuie sa fie distincte: pentru x[k]x[i], pentru orice i=1k-1
d) Solutie finala: k=P
3. Problema combinarilor
Sa se gaseasca toate posibilitatile de a aseza cele N elemente ale multimii {1,2,,N} in
grupe de cate P elemente; NU conteaza ordinea de asezare a elementelor in grupa.
Repere:
a) O solutie este o posibilitate de a aseza cele P elemente
x1, x2, xP
x[k] elementul de pe pozitia k in aceasta asezare
b) x[k] este un element al multimii date, deci x[k]{1,2,N}

c) Validare: daca nu conteaza ordinea elementelor intr-o grupa, se impune ordinea


crescatoare (sau descrescatoare), pentru a nu obtine solutii de forma 1,2,3 si 2,1,3 etc.
deci x[k]>x[k-1], daca k>1
Obs se poate renunta la validare daca multimea valorilor posibile se stabileste la
{x[k-1]+1, N}
d) Solutie finala: k=P
4. Elemente alaturate
Sa se gaseasca toate posibilitatile de a aseza cele N elemente ale multimii {1,2,,N}
astfel incat numerele K1 si K2 sa nu fie alaturi.
Repere:
a) O solutie este o posibilitate de a aseza cele n elemente
X1, x2, xn
x[k] elemental de pe pozitia k in aceasta asezare
b) X[k] este un element al multimii date, deci X[k]{1,2,N}
c) Validare:
- elementele trebuie sa fie distincte: pentru x[k]x[i], pentru orice i=1k-1
- daca x[k]=K1 atunci x[k-1]K2, daca k>1
- daca x[k]=K2 atunci x[k-1]K1, daca k>1
d) Solutie finala: k=N
5. Elemente ordonate
Sa se gaseasca toate posibilitatile de a aseza cele N elemente ale multimii {1,2,N} astfel
incat numarul K1 sa fie intotdeauna inaintea numarului K2.
Ex: N=5
K1=1 si K2=2
Solutia
1 2 3 4 5 - corect
1 3 4 2 5 correct
2 3 4 1 5 nu e corect (1 e dupa 2)
Repere:
a) O solutie este o posibilitate de a aseza cele N elemente
x1, x2, xN
x[k] elementul de pe pozitia k in aceasta asezare
b) x[k] este un element al multimii date, deci x[k]{1,2,N}
c) Validare:
- elementele trebuie sa fie distincte: pentru x[k]x[i], pentru orice i=1k-1
- daca x[k]=K2, atunci trebuie sa existe i=1,k-1, astfel incat x[i]=K1
d) Solutie finala: k=N
6. Elemente separate
Sa se gaseasca toate posibilitatile de a aseza cele N elemente ale multimii {1,2,N} astfel
incat numarul K1 sa fie separat de numarul K2 de exact un element.
Ex: N=5
K1=1 si K2=2
Solutia
1 2 3 4 5 nu e corect
1 3 4 2 5 nu e corect
2 3 1 5 4 correct
1 3 2 5 4 correct
Repere:

a) O solutie este o posibilitate de a aseza cele N elemente


x1, x2, xN
x[k] elementul de pe pozitia k in aceasta asezare
b) x[k] este un element al multimii date, deci x[k]{1,2,N}
c) Validare:
- elementele trebuie sa fie distincte: pentru x[k]x[i], pentru orice i=1k-1
- daca x[k]=K1, atunci k2 fie apare pe pozitia k-2, fie nu apare deloc
- daca x[k]=K2, atunci k1 fie apare pe pozitia k-2, fie nu apare deloc
d) Solutie finala: k=N
7. Problema camilelor Un beduin calatoreste prin desert cu N camile; ca sa nu se
plictiseasca, el vrea sa schimbe asezarea camilelor sale astfel incat nici o camila sa nu
mai vada in fata ei aceeasi camila ca in varianta initiala. Afisati toate solutiile posibile.
Repere:
a) O solutie este o posibilitate de a aseza cele N camile
x1, x2, xN
x[k] camila de pe pozitia k in aceasta asezare
b) Daca se noteaza camilele din pozitia initiala cu 1,2,N,
x[k] este o camila, deci x[k]{1,2,N}
c) Validare:
- camilele trebuie sa fie distincte: pentru x[k]x[i], pentru orice i=1k-1
- camila de pe pozitia k (x[k]) are in fata ei camila x[k-1]; initial avea in fata
ei camila x[k]-1; pentru a respecta conditia, x[k]-1x[k-1], daca k>1
d) Solutie finala: k=N

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