Documente Academic
Documente Profesional
Documente Cultură
METODA BACKTRACKIN
! STANDARD
)n cursul aplicrii metodei "ac'trac'in(, o confi%uraie poate fi obiectul a patru tipuri de modificri i anume : a( Atri" ie +i a,ansea-. : are loc atunci cnd pentru x' mai sunt valori neconsumate &C' V'( i valoarea aleas pentru x' &fie ea ,'( satisface condiiile de continuare. )n acest caz, x' primete valoarea respectiv care se adau% la mulimea valorilor consumate i se avanseaz la componenta x'*1 : x' ,' C' C' {,'} / '*1
b( 0ncercare e+ at. : are loc atunci cnd pentru x' mai sunt valori neconsumate, dar valoarea aleas &fie ea ,'( nu satisface condiiile de continuare. )n acest caz, valoarea respectiv se adau% la mulimea valorilor consumate C' dar nu se avanseaz la componenta urmtoare : C' C' {,'} c( 1e,enire : are loc atunci cnd toate valorile pentru x' au fost consumate &C'=V'( i nu s/a putut avansa la x'*1 pentru c nu sunt satisfcute condiiile de continuare. )n acest caz, se anuleaz valorile consumate pentru componenta x' i se revine la componenta x')1 n ncercarea de a/i atribui acesteia o alt valoare care s permit continuarea construirii vectorului soluie: C' / ')1 d( 1e,enire d p. constr irea nei so! ii : are loc atunci cnd toate componentele vectorului au primit valori care satisfac condiiile interne, adic s/a construit o soluie. )n acest caz se revine la ultima component &x','=n( ncercnd s/i atribuim o nou valoare &dac mai exist( pentru construirea altor soluii. -ondiia '=n*1 este utilizat n practic pentru a sesiza momentul n care s/a construit o soluie. -ondiia '=% &adic C1=V1,..,Cn=Vn( este utilizat n practic pentru a sesiza finalul procesului de construire a soluiilor, adic nc eierea al%oritmului bac0trac0in%. Al%oritmul corespunztor metodei bac0trac0in% este urmtorul : 2iniia!i-ea-. 3 !i3i!e de ,a!ori V1, V2,,Vn '=14 Ci= , ( ) i=1,..,n // configuraia iniial c5t6ti3p '7% // configuraia nu este final dac. '=n*1 // configuraie de tip soluie at nci reine so! ia X=(x1,,xn) '=')1 // revenire dup construirea unei soluii a!t8e! dac. C' V' // mai sunt valori neconsumate at nci a!e(e o ,a!oare ,' din (V')C') C'=C' {,'} //adauga vk la valorile consumate dac. (x1,..,x') satis8ac cond. de contin are at nci x'=,' // atribuie '='*1 // avansea a!t8e! // nimic! "ncercare e#uat s85rsit6dac. a!t8e! C'= // anulam valorile consumate '=')1 // revenire s85rsit6dac. s85rsit6dac. s85rsit6c5t6ti3p
acestea s concid cu primele s numere naturale &inclusiv %(. )n acest caz, funcia care implementeaz mecanismul bac0trac0in% este : ,oid Bac'() { int ',i4 '=14 :;i!e('7%) // mai sunt solutii posibile i8('==n*1) // am obtinut o solutie { 1etso!()4 '))4} // revenire dupa constr. unei solutii e!se i8(x<'=>s) // mai sunt valori neconsumate { x<'=**4 // alege urmatoarea valoarea i8(Cont(')) '**4 // atribuie si avansea a } e!se { x<'==%4 '))4} // anulea a val.consumate si revine la $%k&1' } Funcia Bac' apeleaz: - funcia 1etso! care reine soluia , adic vectorul X &o listeaz sau o compar cu alte soluii obinute anterior( - funcia Cont care care verific dac primele ' componente ale vectorului soluie X satisfac condiiile de continuare, ntorcnd valoarea 1 n caz afirmativ i % n caz contrar
-# .ro+lema re$inelor S se afieze pe ecran toate posibilitile de aranjare a n regine pe o tabl de ah nxn astfel nct oricare dou s nu se atace reciproc. Dou regine se atac reciproc dac se afl pe aceeai linie, pe aceeai coloan sau pe aceeai diagonal. poziie ocupat de o regin va fi reprezentat prin caracterul ! R" , n timp ce o poziie liber va fi reprezentat prin caracterul ! *" . *ste evident c vom plasa doar cte o re%in pe fiecare linie deoarece dou re%ine aflate pe aceeai linie se vor ataca. 1rmeaz s decidem n ce coloan va fi amplasat re%ina de pe fiecare linie. 2eci dimensiunea vectorului soluie X este n &numrul de re%ine(, x<'= fiind coloana n care vom amplasa re%ina de pe linia '. .umerotnd coloanele cu 1,2,,n nseamn c fiecare component x<'= {1,2,n}. Funcia 1etso! va afia o amplasare obinut, iar funcia Cont va verifica dac re%ina de pe linia ', amplasat n coloana x<'= nu se atac cu una din re%inele amplasate anterior. E%emplu: pentru n=$, construirea unei soluii se realizeaz astfel:
4 * * R * * * * * R * * * R * * * * * R * * * * * * * * * * * * R * * * R
R * * * * * * * R * * * R * * * R * * * R * * * R * * * R * * *
* * * *
* * * *
R * R * * * * *
* * * *
* * * *
R * * * R * * * * * * *
* * * *
R * * * * * * *
atri+uie si a)ansea/*
0ncercare e1uat*
0ncercare e1uat*
atri+uie 1i a)ansea/*
0ncercare e1uat*
* * R * * * * * * * * * * * * * * R * * * R * R
R * * * * * * *
* * R * R * * * * * * R * * * R * *
R * * * * * * *
* * R * * * * * R * * R * * * R
R * * * * * * *
* * R * * * * * * * * R * * * R R * * * R *
R * * * * * * *
0ncercare e1uat*
0ncercare e1uat*
0ncercare e1uat*
re)enire la ,2'
atri+uie 1i a)ansea/*
R * * * * *
R * * *
R * * * * *
R * * * * *
R * * *
atri+uie 1i a)ansea/*
* R * R * *
0ncercare e1uat*
R * R *
0ncercare e1uat*
R * * * R *
0ncercare e1uat*
0ncercare e1uat*
R * * * * *
* *
R * * * * * * *
* *
R * * * * * * * * * * *
* * * *
R * * * * * * * * * * *
* * * *
* R * *
R * * *
R * * * * * * *
R * ?inc! * * de>iostrea3.;7 * R * * ?inc! de>3at;.;7 * * * * * * * int x<@=,so!,n4 * ,oid 1etso!() * { * int * i,A4 * * * * * * * * * * * * *
re)enire la ,2"de>iostrea3.;7 atri+uie si ?inc!
0ncercare e1uat*
re)enire la ,2-
0ncercare e1uat*
0ncercare e1uat*
re)enire la ,2'
* R * R * * * * * * * *
R * R * * * * *
R * * * R * * * * * * *
0ncercare
0ncercare
0ncercare
?inc! de>3at;.;7 int x<2%=,so!,n4 ,oid 1etso!() { int i,A4 so!**4 co t>>BCt 9o! tia B>>so!>>end!4 8or(i=14i>=n 4i**) { 8or(A=14 A>=n4 A**) i8(x<i===A) co t>>B 1B4 e!se co t>>B 2B4 co t>>end!4 } cin.(et()4
Informatica clasa a XI-a - Suport de curs } int Cont(int ') { int i4 8or(i=14i>=')14i**) i8(x<'===x<i= DD a"s(x<'=)x<i=)==')i)ret rn %4 ret rn 14 } ,oid Bac'() { int i,'=14 8or(i=14i>=n4i**) x<i==%4 :;i!e('7%) i8 ('==n*1) { 1etso!()4 '))4} e!se i8(x<'=>n) { x<'=**4 i8 (Cont(')) '**4 } e!se { x<'==%4 '))4} } ,oid 3ain(,oid) { co t>>En=F4 cin77n4 Bac'()4 }
3#
enerarea aran4amentelor
S se genereze aranjamentele de n obiecte luate cte k #k,n N*, k<=n<=50$. 1n aran"ament este un %rup de ' din cele n obiecte n care conteaz ordinea. $ soluie va reprezenta un astfel de %rup deci va avea ' elemente. )ntr/un %rup poate fi plasat oricare din cele n obiecte, deci x<pas= {1,2,.,n}. )ntr/un aran"ament valorile nu se repet, deci x<pas= este bine ales dac difer de valorile x<1=, x<2=,.,x<pas)1= de"a plasate n vectorul soluie. E%emplu: pentru %enerarea aran"amentelor de $ obiecte luate cte #, n tabelul urmtor sunt prezentai primii pai efectuai de al%oritmul bac0trac0in%. %" " " " " " " " " " " " %' " ' ' ' ' ' ' ' ' %" ' 3 3 opera5ie atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* Atri+uie 1i a)ansea/* solu5ie 1i re)enire la %6-7 atri+uie 1i a)ansea/* solu5ie 1i re)enire la %6-7 re)enire la %6'7 atri+uie 1i a)ansea/* %" " " " " " " " " " " " %' 3 3 3 3 %" ' ' 3 3 " ' ' opera5ie 0ncercare e1uat* atri+uie 1i a)ansea/* solu5ie 1i re)enire la %6-7 0ncercare e1uat* atri+uie 1i a)ansea/* solu5ie 1i re)enire la %6-7 re)enire la %6'7 atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie 1i a)ansea/* solu5ie 1i re)enire la %6-7
Informatica clasa a XI-a - Suport de curs { // tipareste o solutie int i4 8or(i=14i>='4i**) co t>>x<i=4 co t>>end!4 } int Cont(int pas) { // verifica cond. de continuare pentru componenta $%pas' int i4 8or(i=14i>=pas)14i**) i8(x<pas===x<i=) ret rn %4 // valoarea se repeta ret rn 14 } ,oid Bac'() { int i,pas4 8or(i=14i>='4i**) x<i==%4 // configuratia initiala pas=14 :;i!e(pas7%) i8(pas=='*1) //am obtinut o solutie { 1etso!()4 pas))4 //revenire dupa construirea unei solutii } e!se i8(x<pas=>n) // mai sunt valori neconsumate { x<pas=**4 // alegem o valoare i8(Cont(pas)) pas**4 //atribui si avanse } e!se { x<pas==%4 //anulam val. consumate pentru $%k' pas))4 //revenire la componenta anterioara } } ,oid 3ain() { co t>>Bn,'=B4 cin77n77'4 Bac'()4 }
8#
enerarea su+mul5imilor
%fiai toate submulimile mulimii {1,2,., n} , pentru n natural nenul , n<=10, citit de la tastatur. !entru a rezolva aceast problem vom da o nou semnificaie vectorului soluie i anume : componenta x<'==1 dac elementul , aparine submulimii curente i x<'==% in caz contrar. 3ectorul soluie va avea n elemente binare. E%emplu: pentru n=# se vor afia submulimile {} ,{ #} ,{ 2} ,{ 2,#} ,{ 1} ,{ 1,#} , { 1,2} , { 1,2,#} . 4abelul urmtor ilustreaz evoluia vectorului soluie pentru primii pai.
%" 9 9 9 9 9 9 9 9 9 9 9
opera5ie atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* solu5ia {} 1i re)enire la %6-7 atri+uie 1i a)ansea/* solu5ia { -} 1i re)enire la %6-7 atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* solu5ia { '} 1i re)enire la %6-7 atri+uie 1i a)ansea/* solu5ia { ':-} 1i re)enire la %6-7
%" 9 9 " " " " " " " " "
%9 9 " " 9
opera5ie re)enire la %6'7 re)enire la %6"7 atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* solu5ia { "} 1i re)enire la %6-7 atri+uie 1i a)ansea/* solu5ia { ":-} 1i re)enire la %6-7 re)enire la %6'7 atri+uie 1i a)ansea/* atri+uie 1i a)ansea/*
?inc! de>iostrea3.;7 int x<1%%=,n4 ,oid 1etso!() // tipareste o submultime { int i4 co t>>B{B4 8or(i=14i>=n4i**) i8(x<i=) co t>>i4 co t>>B}B>>end!4 } ,oid Bac'() { int '4 '=14 x<1==)14 // configuratia initiala :;i!e('7%) i8('==n*1) // am obtinut o solutie { 1etso!()4 // tiparim solutia '))4 // revenire dupa construirea unei solutii } e!se i8(x<'=>1) // mai sunt valori neconsumate { x<'=**4 // alegem o valoare '**4 // avansam la componenta $%k(1' x<'==)14 // configuratia initiala ptr. $%k(1' } e!se { x<'==)14 // anulam valorile consumate! '))4 // revenire la componenta $%k&1' } } ,oid 3ain() { co t>>Bn=B4 cin77n4 Bac'()4 }
;# Colorarea <*r5ii
Se consider o hart care cuprinde n ri din care unele au grani comun. S se coloreze harta utiliznd s culori #s<n$ astfel nct oricare dou ri cu grani comun s fie colorate diferit. !entru a memora relaia de vecintate, vom utiliza o matrice binar Anxn n care a<i,A==1 dac rile i si A au %rani comun, respectiv a<i,A==% n caz contrar. 5elaia de vecintate fiind reflexiv, matricea A este simetric fa de dia%onala principal. $ soluie reprezint o colorare a rilor conform cerinelor. *lementul x<'= din vectorul soluie x va reprezenta culoarea atribuit rii '. Sunt n ri, deci vectorul x are n componente. Sunt disponibile s culori, deci $<'= {1,2,s} . 6ara ' este bine colorat dac culoarea ei difer de culoarea rilor vecine de"a colorate. )n fi%ura urmtoare este ilustrat o modalitate de colorare a unei ri format din H ri folosind $ culori.
4abelul urmtor iliustreaz evoluia vectorului de colorare x pentru arta de mai sus i culorile numerotate cu 1,2,#,$. %
"
%
'
%
-
%
3
%
8
%
;
opera5ia atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* 0ncercare e1uat* atri+uie 1i a)ansea/* solu5ie 1i re)enire la %6;7
" " " " " " " " " " " " " "
" ' ' ' ' ' ' ' ' ' ' ' '
" " " " " " " " " " "
" ' -
" ' 3 3
?inc! de>iostrea3.;7 int a<11=<11=,x<11=,n,s,so!4 ,oid citire() // citeste datele de intrare { int i,A4 co t>>Bn 3ar ! tari!orI B4 cin77n4 co t>>Bn 3ar ! c !ori!orI B4 cin77s4
Informatica clasa a XI-a - Suport de curs co t>>B introd ceti re!atii!e de ,ecinatateIB>>end!4 8or(i=14i>=n)14i**) 8or(A=i*14A>=n4A**) { co t>>Btara B>>i>>B este ,ecina c tara B>>A>>B <1J%= KB4 cin77a<i=<A=4 a<A=<i==a<i=<A=4 }
} ,oid retso!() // tipareste o solutie { int i4 so!**4 co t>>B so! tia de co!orare B>>so!>>end!4 co t>>B taraIB4 8or(i=14i>=n4i**) co t>>i>>end!4 co t>>B c !oareaIB4 8or(i=14i>=n4i**) co t>>x<i=4 co t>>end!>>end!4 } int cont(int ') // verifica cond. continuare ptr. $%k' { int i4 8or(i=14i>=')14i**) i8(a<'=<i= LL x<'===x<i=) // tari vecine colorate la fel ret rn %4 ret rn 14 } ,oid "ac'() { int '4 '=14 :;i!e('7%) i8('==n*1) { retso!()4 '))4 } e!se i8(x<'=>s) // mai sunt valori neconsumate { x<'=**4 i8(cont(')) '**4 // atribuie si avansea a } e!se { x<'==%4 // anulam valorile consumate '))4 // revenire } } ,oid 3ain() { citire()4 "ac'()4 i8(Mso!) co t>>Bn exista so! tie de co!orareMB>>end!4 }
10
-nd mulimile n care pot lua valori componentele vectorului soluie sunt identice cu mulimea 9={1,2,.,s} i vectorul soluie x are n componente: procedura recursiv care implementeaz al%oritmul bac0trac0in% este : ,oid Bac'(int ') { int i4 8or(i=14i>=s4i**) { x<'==i4 // alegem o valoare i8(Cont(')) i8('==n) 1etso!()4 // retine o solutie e!se Bac'('*1) // atribuie si avansea a } } )n acest al%oritm, 1etso! este o funcie care reine soluia curent %enerat &o tiprete sau o compar cu alte soluii obinute anterior(. Cont este o funcie care ntoarce valoarea 1 dac valoarea aleas pentru componenta x<'= a vectorului satisface condiiile de continuare, i % n caz contrar. -ondiia '=n este folosit pentru a sesiza momentul n care s/a completat un vector soluie. -iclul 8or parcur%e pe rnd valorile posibile 1,2,..s i ncearc s atribuie componentei x<'= o valoare din acest mulime. !entru fiecare valoare aleas, funcia Cont verific dac sunt satisfcute condiiile de continuare. )n caz afirmativ, se reia recursiv acelai proces pentru componenta x<'*1= a vectorului. )n caz contrar, se ncearc urmtoarea valoarea disponibil din mulimea 1,2,.,s. 2ac toate valorile au fost consumate fr a se putea nainta, apelul recursiv curent se nc eie, i se revine la componenta x<')1= deoarece, datorit mecanismului recursiv, pe stiva procesorului se salveaz, n ordine, valorile parametrului valoare '. )nc eierea unui apel recursiv pentru valoarea curent ', presupune recuperarea din stiva procesorului a valorii anterioare & ')1( i continuarea al%oritmului pentru aceasta, adic atribuirea unei alte valori pentru componenta x<')1= a vectorului soluie. )n momentul n care toate apelurile recursive se nc eie &stiva procesorului este vid( , al%oritmul bac0trac0in% se nc eie.
>#
enerarea permut*rilor
S se genereze toate permutrile mulimii {1,2,,n} pentru n natural nenul dat. 3ectorul soluie X are n componente, fiecare element x<'= {1,2,.n}. $ valoare x<'= este bine aleas dac este diferit de toate valorile x<1=,..,x<')1= alese anterior, fiindc ntr/o permutare valorile nu se repet. )n tabelul urmtor este ilustrat evoluia vectorului soluie x pentru n=#. %" " " " " " " " " " " %' " ' ' ' ' ' ' %" ' " opera5ia atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* atri+uie solu5ie 1i continu* %6-7 re)enire la %6'7 atri+uie 1i a)ansea/* 0ncercare e1uat* %" " " " ' ' ' ' ' ' ' %' " " " " " " %" ' opera5ia 0ncercare e1uat* re)enire la %6'7 re)enire la %6"7 atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* atri+uie solu5ie 1i continu* cu %6-7 re)enire la %6'7
Informatica clasa a XI-a - Suport de curs " " ' ' atri+uie solu5ie 1i continu* cu %6-7 ' ' ' 0ncercare e1uat* atri+uie 1i a)ansea/*
11
?inc! de>iostrea3.;7 int x<11=,n4 ,oid 1etso!() { int i4 8or(i=14i>=n4i**) co t>>x<i=4 co t>>end!4 } int Cont(int ') { int i4 8or(i=14i>=')14i**) i8(x<'===x<i=) ret rn %4 ret rn 14 } ,oid Bac'(int ') { int i4 8or(i=14i>=n4i**) { x<'==i4 i8(Cont(')) i8('==n) 1etso!()4 e!se Bac'('*1)4 } } ,oid 3ain() { co t>>Bn=B4 cin77n4 Bac'(1)4 }
?#
enerarea permut*rilor
S se genereze toate permutrile mulimii {1,2,,n} pentru n natural nenul dat. 3ectorul soluie X are n componente, fiecare element x<'= {1,2,.n}. $ valoare x<'= este bine aleas dac este diferit de toate valorile x<1=,..,x<')1= alese anterior, fiindc ntr/o permutare valorile nu se repet. )n tabelul urmtor este ilustrat evoluia vectorului soluie x pentru n=#. %" " " " " " " " " %' " ' ' ' ' ' ' %" ' opera5ia atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* atri+uie solu5ie 1i continu* %6-7 re)enire la %6'7 %" " " " ' ' ' ' ' %' " " " " %" ' opera5ia 0ncercare e1uat* re)enire la %6'7 re)enire la %6"7 atri+uie 1i a)ansea/* atri+uie 1i a)ansea/* 0ncercare e1uat* 0ncercare e1uat* atri+uie
Informatica clasa a XI-a - Suport de curs " " " " " ' ' atri+uie 1i a)ansea/* 0ncercare e1uat* atri+uie solu5ie 1i continu* cu %6-7 ' ' ' ' " " ' solu5ie 1i continu* cu %6-7 re)enire la %6'7 0ncercare e1uat* atri+uie 1i a)ansea/*
12
?inc! de>iostrea3.;7
int x<11=,n4 ,oid 1etso!() { int i4 8or(i=14i>=n4i**) co t>>x<i=4 co t>>end!4 } int Cont(int ') { int i4 8or(i=14i>=')14i**) i8(x<'===x<i=) ret rn %4 ret rn 14 } ,oid Bac'(int ') { int i4 8or(i=14i>=n4i**) { x<'==i4 i8(Cont(')) i8('==n) 1etso!()4 e!se Bac'('*1)4 } } ,oid 3ain() { co t>>Bn=B4 cin77n4 Bac'(1)4 }
Informatica clasa a XI-a - Suport de curs } int Cont(int ') { int i4 i8('==1) ret rn 14 // prima componenta este totdeauna corecta i8(a"s(x<'=)x<')1=)>2 DD a"s(x<'=)x<')1=)7#) ret rn %4 // intre $%k' si $%k&1' nu sunt 1 sau 2 persoane 8or(i=14i>=')14i**) i8(x<'===x<i=) // persoana s&a ase at de)a pe un scaun ret rn %4 ret rn 14 } ,oid Bac'(int ') { int i4 8or(i=14i>=n4i**) { x<'==i4 //alegem persoana care se asea a pe scaunul k i8(Cont(')) i8('==n) 1etso!()4 //tiparim o solutie de ase are e!se Bac'('*1)4 // trecem la scaunul urmator } } ,oid 3ain() { co t>>Bn=B4 cin77n4 Bac'(1)4 i8(Mso!) co t>>Bn exista so! tii de ase-areMB>>end!4 }
13
14
?inc! de>iostrea3.;7 int x<1G=,n4 ,oid 1etso!() { int i,A4 8or(i=14i>=n4i**) { 8or(A=14A>=n4A**) i8(x<i===A) co t>>BNB4 e!se co t>>B.B4 co t>>end!4 } co t>>end!4 cin.(et()4 } int Cont(int ') { int i4 8or(i=14i>=')14i**) i8(x<'===x<i=) // doua ret rn %4 ret rn 14 } ,oid Bac'(int ') { int i4 8or(i=14i>=n4i**) { x<'==i4 // plasam tura i8(Cont(')) i8('==n) 1etso!()4 e!se Bac'('*1)4 } } ,oid 3ain() {
15