Sunteți pe pagina 1din 15

Informatica clasa a XI-a - Suport de curs

METODA BACKTRACKIN

! STANDARD

"# Mecanism $eneral


Apare frecvent situaia n care rezolvarea unei probleme conduce la determinarea unor vectori soluie de forma X=(x1, x2,,xn) n care : - fiecare component a vectorului soluie aparine unei mulimi finite de valori Vi - exist anumite relaii care trebuie satisfcute de componentele vectorului, numite condiii interne, astfel nct X este soluie dac i numai dac componentele sale satisfac aceste condiii interne E%emplu: Fie dou mulimi de litere V1={A,B,C} i V2={M,N}. Se cere s se determine acele perec i (x1,x2) cu x1 V1 i x2 V2 cu proprietatea c dac x1 {A,B} atunci x2 N. Soluiile care satisfac condiia impus sunt : {A,M},{B,M},{C,M},{C,N}. !rodusul cartezian V1xV2x.Vn se numete spai ! so! ii!or posi"i!e. Soluiile problemei sunt acele soluii posibile care ndeplinesc condiiile interne. E%emplu: Fie un "oc !ronosport n care sunt n discuie doar # meciuri. $ persoan dorete s "oace, plecnd cu convin%erea c n variantele cti%toare nu pot exista mai mult de dou meciuri nule &pronostic '(, iar la ultimul meci %azdele nu cti%. !ersoana dorete s %seasc toate variantele care ndeplinesc aceste condiii. )n acest problem V1=V2=V#=V$={%,1,2}. *xist mai muli vectori care ndeplinesc condiiile interne : (0,1,2,0),(1,2,1,2),+. $ modalitate de rezolvare ar fi s se %enereze pe rnd cele #$=&1 soluii posibile i s se alea% cele care satisfac condiiile interne. Aceast metod este inacceptabil pentru c se consum prea mult timp. ,etoda "ac'trac'in( evit %enerarea tuturor soluiilor posibile, scurtnd timpul de lucru. -omponentele vectorului primesc valori n ordinea cresctoare a indicilor. Astfel, x' primete valori numai dup ce x1,x2,.x')1 au primit valori care nu contrazic condiiile interne. )n plus, valoarea lui x' trebuie aleas astfel nct, vectorul soluie parial x1,,x' s ndeplineasc i el anumite condiii, numite condiii de contin are, i care sunt derivate din condiiile interne. Astfel, pentru exemplul anterior, dac x1=x2=% &meci nul(, atunci x# nu mai poate primi valoarea %. .endeplinirea condiiilor de continuare exprim faptul c oricum am ale%e n continuare valori pentru componentele x'*1,..,xn, nu vom obine o soluie. Stabilirea condiiilor de continuare este foarte important, o ale%ere bun ducnd la o reducere considerabil a numrului de calcule. !rin "ac'trac'in(, orice vector soluie este construit pro%resiv, ncepnd cu prima component i mer%nd ctre ultima, cu eventuale reveniri asupra valorilor atribuite anterior. -omponentele x1,x2,.xn iau valori n mulimile V1,V2,.Vn# !rin atribuiri reuite sau ncercri de atribuiri euate din cauza nerespectrii condiiilor de continuare, anumite valori sunt consumate. !entru o component x' din vectorul soluie, notm cu C' V' mulimea valorilor consumate la momentul curent. !utem descrie metoda "ac'trac'in( utiliznd o confi%uraie de forma : x1 C1 x2xn C2Cn

)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

Informatica clasa a XI-a - Suport de curs

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

'# (arianta iterati)* standard a metodei +ac,trac,in$


!ro%ramarea al%oritmului bac0trac0in% se simplific mult dac mulimile n care pot lua valori componentele vectorului sunt identice cu mulimea finit 9={1,2,.,s} adic cu primele s numere naturale. ,a"oritatea problememlor rezolvabile prin bac0trac0in% permit o codificare a datelor de intrare astfel nct

Informatica clasa a XI-a - Suport de curs

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:

Informatica clasa a XI-a - Suport de curs

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

?inc! de>iostrea3.;7 int x<G%=,n,'4 ,oid 1etso!()

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.

Informatica clasa a XI-a - Suport de curs

%" 9 9 9 9 9 9 9 9 9 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 9 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 }

Informatica clasa a XI-a - Suport de curs

;# 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 }

=# (arianta recursi)* a metodei +ac,trac,in$

Informatica clasa a XI-a - Suport de curs

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 }

"9# Rearan4area persoanelor


&n grup de n persoane sunt aezate pe un rnd de scaune. 'ntre oricare doi vecini izbucnesc conflicte de interese astfel nct, persoanele i schimb aezarea. S se determine toate posibilitile de reaezare a persoanelor astfel nct, ntre oricare doi vecini din varianta iniial s e(iste una sau dou alte persoane. -onsiderm c iniial persoanele sunt asezate pe scaune n ordinea 1,2,...,n. )ntr/o nou aezare, x<'= va fi persoana asezata pe scaunul '. !ersoana &oricare din mulimea 1,2,.,n( este bine ales dac ntre ea i persoana x<')1= &de pe scaunul alturat( exist 1 sau 2 alte persoane i, desi%ur, persoana respectiv nu a fost de"a aezat pe un scaun. 1n vector soluie x va reprezenta o aezare obinut n acest mod i va avea n componente. ?inc! de>iostrea3.;7 ?inc! de>3at;.;7 int x<21=,n,so!4 ,oid 1etso!() { int i4 so!**4 8or(i=14i>=n4i**) co t>>x<i=4 co t>>end!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

""# A1e/area turelor pe ta+la de 1a<


Se citete de la tastatur un numr natural nenul n #n<=14$ care reprezint dimensiunea unei table de ah. S se genereze toate modalitile de aezare pe tabla de ah a n ture, astfel nct oricare dou s nu se atace reciproc #dou ture se atac dac sunt pe aceeai linie sau pe aceeai coloan$. Fiecare linie a tablei de a va conine o tur7 la fel i fiecare coloan. 3ectorul soluie x va reprezenta o amplasare a celor n ture. 2eoarece pe fiecare linie nu poate fi dect o sin%ur tur, un element x<'= din vectorul soluie va reprezenta coloana n care am amplasat tura de pe linia '. .umerotnd coloanele cu 1,2, ,n, elementul x<'= va lua valori n acest mulime.4ura de pe linia ' este bine amplasat dac nu se afl n aceeai coloan cu o alt tur amplasat anterior. !ractic, problema se reduce la %enerarea permutrilor de n obiecte &coloanele tablei de a (, o permutare reprezentnd o soluie de aran"are a turelor. )n fi%ura urmtoare este ilustrat o soluie de aezare a turelor pe tabla de a pentru n=&.

Informatica clasa a XI-a - Suport de curs @ T @ @ @ @ @ @ T @ @ @ @ @ @ @ @ @ @ T @ @ @ @ @ @ T @ @ @ @ @ @ @ @ @ T @ @ @ @ @ @ @ @ @ T @ @ @ @ @ @ @ @ T @ @ @ @ @ T @ @

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() {

ture in aceeasi coloana

din linia k in coloana i // tiparim o solutie // trecem la linia urmatoare

Informatica clasa a XI-a - Suport de curs co t>>Bn=B4 cin77n4 Bac'(1)4 }

15

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