Вы находитесь на странице: 1из 0

Metoda backtracking

! Backtracking iterativ
! Backtracking recursiv
! Implement!ri sugerate
! Probleme propuse
! Solu"iile problemelor
Capitolul
19


Metoda backtracking este o metod! de programare cu ajutorul c!reia se rezolv! pro-
blemele n care:
! solu"ia se poate reprezenta sub forma unui tablou X = (x
1
, x
2
, , x
n
) cu x
1
# M
1
,
x
2
# M
2
etc. M
1
, M
2
, ..., M
n
fiind mul"imi finite avnd s
1
, s
2
, ..., s
n
elemente.
! ntre elementele tabloului X exist! anumite leg!turi impuse n enun".

Condi!ii interne
n fiecare problem! sunt date anumite rela"ii care trebuie s! existe ntre componen-
tele x
1
, x
2
, ..., x
n
ale vectorului X, numite condi!ii interne.

Spa!iul solu!iilor posibile
Mul"imea M
1
$ M
2
$... $ M
n
se nume#te spa!iul solu!iilor posibile.

Condi!ii de continuare
Dac! la pasul k, condi"iile interne sunt satisf!cute, algoritmul se continu! n func"ie
de cerin"e. Dac! mai trebuie c!utate componente, deoarece num!rul lor se cunoa#te #i
nc! nu le-am ob"inut pe toate, sau componentele nc! nu constituie o solu"ie pe baza
unor propriet!"i, condi"iile de continuare vor permite continuarea algoritmului.

Solu!ii rezultat
Acele solu"ii dintre solu"iile posibile care satisfac condi"iile impuse de problem!
(condi"iile interne #i condi"iile de continuare nu cer componente n plus) se numesc
solu!ii rezultat.
O metod! de rezolvare a acestei categorii de probleme ar fi determinarea tuturor
solu"iilor posibile #i apoi c!utarea acelora care satisfac condi"iile interne. Dezavantajul
este u#or de observat deoarece timpul cerut de aceast! c!utare este foarte mare.
19. Metoda backtracking 369

Modul de lucru al metodei backtracking
! Elementele din tabloul X primesc pe rnd valori, adic! lui x
k
i se atribuie o valoare
numai dac! au fost deja atribuite valori elementelor x
1
, x
2
, ..., x
k 1
.
! n plus, lui x
k
i se atribuie o valoare numai dac! pentru valorile x
1
, x
2
, ..., x
k 1
#i va-
loarea propus! pentru x
k
sunt ndeplinite condi"iile interne #i cele de continuare im-
puse de problem!. (n cazul n care aceste condi"ii nu sunt ndeplinite, oricum am
alege urm!torii termeni x
k + 1
, ..., x
n
, nu vom ajunge la o solu"ie n care condi"iile in-
terne s! fie satisf!cute.)
! Dac! la pasul k condi"iile de continuare nu sunt ndeplinite trebuie s! se fac! o alt!
alegere pentru x
k
din mul"imea M
k
.
! Dac! mul"imea M
k
a fost epuizat! (s-au testat toate valorile din mul"ime) se decre-
menteaz" k #i se ncearc! o alt! alegere pentru x
k 1
din

mul"imea M
k 1
.

Observa"ii
Acestei decrement!ri a lui k i se datoreaz! numele metodei, exprimnd faptul c!
atunci cnd nu putem avansa, se avanseaz! n sens invers (napoi) n secven"a cu-
rent! a solu"iei.
ntre condi"iile interne #i cele de continuare exist! o strns! leg!tur!. O bun! alege-
re a condi"iilor de continuare are ca efect reducerea num!rului de calcule.

19.1. Backtracking iterativ
Condi"iile interne vor fi verificate n subalgoritmul Posibil(k). Acesta returneaz!
adev"rat dac! ad!ugarea componentei x
k
a #irului solu"ie este posibil! #i fals n caz
contrar.

Subalgoritm Posibil(k):
dac! condi!iile interne nu sunt ndeplinite atunci
Posibil % fals
ie#ire for!at"
sfr"it dac!
Posibil % adev"rat
sfr"it subalgoritm

Generarea solu"iilor se realizeaz! cu subalgoritmul Back.

Subalgoritm Back:
k % 1
x[k] % 0
ct timp k > 0 execut!:
ok % fals
370 19. Metoda backtracking

ct timp (x[k]< valoare maxim" permis") "i nu ok execut!:
{ mai sunt valori netestate n mul!ime, deci lui x[k] i se atribuie o alt" valoare }
x[k] % x[k] + 1
ok % Posibil(k) { poate am g"sit valoare posibil" pentru x[k] }
sfr"it ct timp
dac! nu ok atunci
{ dac" nu, se decrementeaz" k pentru a alege o valoare nou" pentru aceasta }
k % k - 1
altfel { dac" am ajuns la sfr#itul gener"rii }
dac! k = num"rul de elemente cerut atunci { sau alt" condi!ie }
scrie solu!ia
altfel
k % k + 1 { trecem la urm"torul element din solu!ie }
x[k] % 0 { ini!ializ"m noul element din tabloul solu!ie }
sfr"it dac!
sfr"it dac!
sfr"it ct timp
sfr"it subalgoritm

19.2. Backtracking recursiv
Algoritmul poate fi implementat #i recursiv (func"ia Posibil(k) are forma prezen-
tat!):

Subalgoritm Back(k):
pentru i = 1,valoarea maxim" impus" de problem" execut!:
x[k] % i
dac! Posibil(k) atunci
{ dac" am ajuns la sfr#itul gener"rii }
dac! (*) k = num"rul de elemente cerut atunci
{ sau alt" condi!ie de continuare }
scrie solu!ia(k)
altfel
Back(k+1)
sfr"it dac!
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

Dac! n condi"ia de continuare (*) expresia este format! din subexpresii logice
(rela"ionale) #i condi"ia nu este ndeplinit!, pe ramura altfel va trebui s! decidem
motivul pentru care condi"ia nu este ndeplinit!. Dac! de exemplu, num!rul de ele-
19. Metoda backtracking 371

mente cerut s-a atins, dar din alte motive solu"ia ob"inut! nu este corect! #i deci nu se
scrie, atunci evident, nu apel!m subalgoritmul Back pentru valoarea k + 1, ci vom ie#i
din subprogram, asigurnd totodat! revenirea la pasul precedent #i c!utarea unei valori
noi pentru k 1.

Observa"ie
Algoritmii de rezolvare a problemelor cu metoda backtracking, n principiu, vor
respecta forma general! de mai sus, dar de fiecare dat! vom c!uta posibilit!"ile de op-
timizare #i implement!ri ct mai sugestive. Un caz special l reprezint! acele probleme
n care solu"ia se compune din dou! (sau mai multe) #iruri care descriu, de exemplu,
coordonate n plan.

19.3. Implement!ri sugerate
Pentru a v! familiariza cu analiza problemelor care se rezolv! cu metoda backtracking,
precum cu implementarea programelor de rezolvare, v! recomand!m s! ncerca"i s!
rezolva"i urm!toarele probleme:
1. generarea tuturor permut!rilor #irului de numere 1, 2, ..., n;
2. a#ezarea a 8 regine pe tabla de #ah, f!r! ca acestea s! se atace;
3. generarea produsului scalar a dou! mul"imi;
4. generarea tuturor aranjamentelor de n luate cte m;
5. generarea tuturor perechilor de paranteze care se nchid corect;
6. generarea tuturor func"iilor injective cunoscnd mul"imea de argumente #i cea a
valorilor func"iilor;
7. generarea tuturor func"iilor surjective cunoscnd mul"imea de argumente #i cea a
valorilor func"iilor;
8. generarea tuturor parti"iilor unui num!r dat;
9. generarea parti"iilor mul"imii {1, 2, , n};
10. generarea tuturor turnurilor de cuburi n func"ie de anumite propriet!"i date;
11. ie#irea din labirint;
12. ie#irea din labirint (pere"ii celulelor p!stra"i pe bi"i);
13. aranjarea unor piese de tetris, astfel nct s! completeze integral un dreptunghi de
dimensiuni date;
14. determinarea turnului de cuburi de n!l"ime minim!;
15. determinarea drumului pe care broasca ajunge la l!cust! #i se ntoarce la locul de
pnd! pe suprafa"a unui lac nghe"at, unde ghea"a se rupe n urma efectu!rii s!ritu-
rilor efectuate conform s!riturii calului pe tabla de #ah;
16. mutarea elementelor unei matrice de dimensiuni m $ n ntr-un #ir a, astfel nct
dou! elemente aflate pe pozi"ii consecutive n #irul a s! fie vecine n matrice #i
suma 1 a
1
+ 2 a
2
+ + m n a
mn
s! fie minim!.

372 19. Metoda backtracking

19.4. Probleme propuse

19.4.1. Numere
Se d! un tablou unidimensional de n numere ntregi. S! se genereze toate tablourile al-
ternante (#iruri n care dup! fiecare element strict pozitiv urmeaz! unul strict negativ #i
dup! fiecare element strict negativ urmeaz! unul strict pozitiv) care s! con"in! elemen-
te din #irul dat n ordinea ini"ial! a lor.

Date de intrare
Elementele tabloului se afl! n fi#ierul de intrare NUMERE.IN, un num!r pe o linie.

Date de ie#ire
Solu"iile se vor scrie n fi#ierul de ie#ire NUMERE.OUT. O solu"ie (un #ir alternant) se
va scrie pe o linie. n cadrul acestor #iruri dou! numere vor fi separate printr-un spa"iu.

Restric"ii #i preciz!ri
! 1 & n & 100 (se determin! pe baza num!rului numerelor din fi#ierul de intrare)
! Dac! din tabloul dat nu se poate forma nici un sub#ir care ndepline#te cerin"ele
problemei, n fi#ierul de ie#ire se va scrie mesajul 'imposibil'.

Exemple
NUMERE.IN
-1 0 3 4
NUMERE.OUT
imposibil

NUMERE.IN
1 2 3
NUMERE.OUT
1 3
2 3

19.4.2. Rechizite
Pentru prima zi de #coal! un elev dore#te s!-#i cumpere rechizite #colare ale c!ror cos-
turi le cunoa#te. Acesta are la dispozi"ie o sum! de bani S #i dore#te s! aleag! din mai
multe obiecte cum ar fi:
! creioane
! radiere
! caiete
! liniare
! rezerve stilou
! creioane colorate
! acuarele
$tiind c! elevul a stabilit un necesar maxim pentru fiecare obiect, afi#a"i cte buc!"i
din fiecare obiect reu#e#te s! cumpere.
19. Metoda backtracking 373

Date de intrare
Datele de intrare se citesc din fi#ierul RECHIZIT.IN care are urm!toarea structur!:
Pe prima linie se g!se#te suma de bani S de care dispune elevul.
Pe a doua linie se g!sesc costurile celor 7 obiecte, separate prin cte un spa"iu.
Pe a treia linie se g!sesc cantit!"ile maxime necesare din fiecare obiect, separate
prin cte un spa"iu.

Date de ie#ire
Datele de ie#ire se vor scrie pe linii distincte n fi#ierul de ie#ire RECHIZIT.OUT sub
forma urm!toare:
buc*costnume produs
unde buc reprezint! num!rul buc!"ilor din rechizitele avnd denumirea nume produs #i
pre"ul unitar cost.
Dac! elevul nu reu#e#te s! efectueze cump!raturile n condi"iile specificate n
enun", n fi#ierul de ie#ire se va scrie mesajul 'imposibil'.

Restric"ii #i preciz!ri
! 1 & S & 1000000;
! costurile maxime sunt numere pozitive mai mici dect 500000;
! cantit!"ile maxime sunt numere pozitive mai mici dect 100;
! nu este necesar ca elevul s! cumpere din toate obiectele; l!sa"i-l pe el s! aleag! ce
anume #i n ce cantit!"i cump!r!, cu condi"ia s!-#i cheltuie to"i banii.

Exemple
RECHIZIT.IN
100000
2000 5000 3000 12000 6000 80000 70000
1 2 1 2 1 0 0
RECHIZIT.OUT
imposibil

RECHIZIT.IN
100000
1000 2000 10000 3000 4000 20000 80000
1 2 1 1 1 1 1

RECHIZIT.OUT
1*20000-set creioane colorate
1*80000-set acuarele

1*1000-creioane
1*2000-radiere
1*10000-caiete
1*3000-liniare
1*4000-rezerve stilou
1*80000-set acuarele
374 19. Metoda backtracking

19.4.3. Expresie
Se d! un #ir de n numere ntregi. S! se plaseze ntre aceste numere n 1 operatori arit-
metici (+, , *, /), astfel nct valoarea expresiei ob"inute s! fie egal! cu un num!r n-
treg dat m.

Date de intrare
Pe prima linie a fi#ierului de intrare EXPRES.IN se afl! num!rul ntreg n. Pe a doua li-
nie se afl! cele n numere, separate prin cte un spa"iu, iar pe a treia linie se afl! num!-
rul m.

Date de ie#ire
n fi#ierul de ie#ire EXPRES.OUT fiecare solu"ie este scris! pe linie nou!. O solu"ie are
forma:
m=expresie, unde expresie este o succesiune de operanzi #i operatori, primul #i ultimul
fiind operanzi.
Dac! pentru numerele date nu se poate g!si o combina"ie de operatori astfel nct
rezultatul expresiei ob"inute s! fie num!rul m dat, n fi#ier se va scrie mesajul
'imposibil'.

Restric"ii #i preciz!ri
! 2 & n < 10;
! 100 & nr
i
& 100, i = 1, 2, , n;
! valoarea expresiei trebuie s! fie un num!r ntreg la fiecare pas al evalu!rii;
! nu se respect! prioritatea operatorilor cunoscut! din aritmetic! (opera"iile se vor
efectua de la stnga la dreapta n ordinea n care apar n expresie).

Exemplu
EXPRES.IN
4
12 12 1 1
24
EXPRES.OUT
24=12+12+1-1
24=12+12-1+1
24=12+12*1*1
24=12+12*1/1
24=12+12/1*1
24=12+12/1/1

19.4.4. Ma#inu"e
Un copil dore#te s! a#eze n ma#inu"e numerotate de la 1 la n n n cutii identificate prin
numere de la 1 la n. S! se afi#eze toate modalit!"ile n care copilul poate s! a#eze ma-
#inu"ele n cutii, #tiind c! ntr-o cutie ncap cel mult m ma#inu"e.


19. Metoda backtracking 375

Date de intrare
Fi#ierul de intrare MASINI.IN con"ine o singur! linie pe care sunt trecute valorile n #i
m, separate printr-un spa"iu.

Date de ie#ire
Fi#ierul de ie#ire MASINI.OUT va con"ine pentru fiecare solu"ie ob"inut! cte n linii
care vor descrie con"inutul cutiilor. Pe linia i (i = 1, 2, , n) se scriu m numere de or-
dine ale ma#inu"elor care sunt puse n cutia avnd num!rul de ordine i. Aceste numere
se vor desp!r"i printr-un spa"iu, iar n fa"a numerelor de ordine a ma#inu"elor se va scrie
cuvntul cutia, apoi un spa"iu #i num!rul de ordine i, care la rndul lui este urmat de
': '. Dac! ntr-o cutie nu se pune nici o ma#inu"!, ea nu va con"ine dup! ': ' nimic.

Restric"ii #i preciz!ri
! 1 & n, m & 7.

Exemplu
MASINI.IN
2 3
MASINI.OUT
cutia 1: 1 2
cutia 2:

cutia 1: 1
cutia 2: 2

cutia 1: 2
cutia 2: 1

cutia 1:
cutia 2: 1 2

19.4.5. Depozit
ntr-un depozit compartimentat conform unui caroiaj a izbucnit focul n m locuri dife-
rite. Magazionerul aflat n depozit ar vrea s! ias! din cl!dire. $tiind c! ie#irea se afl! n
col"ul din dreapta-jos a depozitului, s! se determine toate drumurile posibile spre ie#ire.
n anumite compartimente, corespunz!toare unor p!tr!"ele din caroiaj, se afl!
obiecte peste care magazionerul nu va putea trece sau s!ri. De asemenea, pe drumul
s!u spre ie#ire, magazionerul nu poate trece prin compartimentele vecine orizontal,
vertical sau pe diagonal! celor cuprinse de incendiu. Magazionerul va putea s! traver-
seze depozitul trecnd printr-o succesiune de compartimente vecine orizontal sau ver-
tical.

Date de intrare
n fi#ierul de intrare DEPOZIT.IN se vor afla datele referitoare la depozitul avnd for-
ma p!tratic!, pozi"ia magazionerului #i pozi"iile cuprinse de fl!c!ri.
376 19. Metoda backtracking

! Pe prima linie a fi#ierului se afl! dimensiunile depozitului (n);
! Pe urm!toarele n linii se afl! cte n valori, reprezentnd datele referitoare la depozit:
0 reprezint! spa"iu liber;
1 reprezint! un obstacol;
2 reprezint! un foc;
3 reprezint! pozi"ia magazionerului.

Date de ie#ire
Solu"ia se va afi#a n fi#ierul de ie#ire DEPOZIT.OUT sub forma unui tablou bidimen-
sional avnd n linii #i n coloane. Acest tablou va con"ine traseul magazionerului.
Pentru fiecare valoare k (cuprins! ntre 1 #i lungimea traseului) n tablou va exista un
singur element avnd valoarea k, (corespunz!tor pasului k al magazionerului), n rest
tabloul va con"ine elemente egale cu 0.

Restric"ii #i preciz!ri
! 2 & n < 8;
! dou! solu"ii n fi#ierul de ie#ire vor fi separate printr-o linie goal!;
! dac! nu se poate ajunge la ie#ire din cauz! c! este imposibil s! se ias! din depozit
datorit! focurilor #i obstacolelor, n fi#ierul de ie#ire se va scrie 'imposibil'.

Exemplu
DEPOZIT.IN
5
3 0 0 2 0
0 1 0 0 0
0 0 0 0 0
0 0 0 1 0
2 0 0 0 0
DEPOZIT.OUT
1 0 0 0 0
2 0 0 0 0
3 4 5 6 7
0 0 0 0 8
0 0 0 0 9

1 0 0 0 0
2 0 0 0 0
3 4 5 0 0
0 0 6 0 0
0 0 7 8 9

19.4.6. Cal #i nebun pe tabla de #ah
Pe o tabl! de #ah de dimensiune n $ n se afl! un nebun n pozi"ia (x, y) #i un cal n po-
zi"ia ini"ial! (x
0
, y
0
). Calul trebuie s! ajung! din aceast! pozi"ie ini"ial! ntr-o pozi"ie fi-
nal! (x
1
, y
1
) f!r! s! treac! de dou! ori prin aceea#i pozi"ie #i f!r! s! se opreasc! pe un
p!trat aflat n raza de ac"iune a nebunului.
Afi#a"i toate secven"ele de pa#i de lungime minim! prin care calul poate s! ajung!
din pozi"ia ini"ial! n pozi"ia final! f!r! a fi capturat de nebun.
19. Metoda backtracking 377

Date de intrare
Fi#ierul de intrare CALNEBUN.IN are urm!toarea structur!:
! pe prima linie se afl! un num!r natural diferit de 0, reprezentnd dimensiunea ta-
blei;
! pe cea de-a doua linie sunt scrise dou! numere naturale, desp!r"ite printr-un spa"iu,
corespunz!tor pozi"iei nebunului;
! pe urm!toarele dou! linii sunt nregistrate, n formatul liniei doi, pozi"ia ini"ial! a
calului, precum #i pozi"ia pe care trebuie s! ajung!.

Date de ie#ire
Fi#ierul de ie#ire CALNEBUN.OUT va con"ine cte o linie, corespunz!toare unei solu"ii.
Fiecare solu"ie va fi scris! sub forma unor perechi de numere naturale indicnd traseul
calului. Aceste perechi reprezint! coordonatele p!tratelor tablei de #ah atinse de cal pe
traseul lui ncepnd cu pozi"ia ini"ial! #i terminnd cu pozi"ia final!. Perechile se vor
scrie ncadrate ntre paranteze rotunde #i n interiorul parantezei desp!r"ite de o virgul!.
Dac! din start calul se afl! n b!taia nebunului sau coordonatele citite din fi#ier nu
se afl! n interiorul tablei, n fi#ierul de ie#ire se va scrie mesajul 'Imposibil'.

Restric"ii #i preciz!ri
! 2 & n & 8;
! calul nu are voie s! ias! de pe tabl!;
! pozi"ia ini"ial! nu poate s! coincid! cu pozi"ia final!;
! n cazul n care coordonatele ini"iale #i finale ale calului se afl! n interiorul tablei
#i pozi"ia ini"ial! nu este atacat! de nebun, atunci va exista ntotdeauna cel pu"in o
solu"ie.

Exemplu
CALNEBUN.IN
6
2 3
2 2
4 4
CALNEBUN.OUT
(2,2)(4,3)(2,4)(3,6)(4,4)
(2,2)(4,3)(5,5)(3,6)(4,4)
(2,2)(4,3)(5,5)(6,3)(4,4)
(2,2)(4,3)(6,4)(5,2)(4,4)
(2,2)(4,3)(5,1)(6,3)(4,4)
(2,2)(4,3)(3,1)(5,2)(4,4)




378 19. Metoda backtracking

19.5. Solu"iile problemelor propuse

19.5.1. Numere
Problema dat! se rezolv! prin metoda backtracking, deoarece se cere generarea tutu-
ror sub#irurilor care au propriet!"ile cerute n enun".
Fie a #irul dat avnd n elemente numere ntregi. Vom lucra la nivelul indicilor, adi-
c! vom genera mul"imi de indici ai elementelor din a, formnd solu"ia n #irul de indici x.

Exemplu
S! presupunem c! #irul a are 7 elemente numere ntregi: 1 2 2 3 1 4 7.
O solu"ie a problemei este #irul de numere: 1 2 2 1 7.
$irul de indici x care se genereaz! n acest caz, este: 1 2 3 5 7.

Se observ! c! n enun" nu se specific! lungimea solu!iei, deci este necesar! genera-
rea tuturor solu"iilor de lungimi variabile (cel pu"in dou! elemente #i cel mult n). Vom
asigura generarea lor, specificnd lungimile posibile n programul principal ntr-o
structur! de tip pentru. Pentru fiecare lungime posibil! de la 2 la n vom genera toate
sub#irurile de lungimea respectiv! care respect! cerin"ele din enun".
Vom construi un subalgoritm de validare care verific! dac! exist! cel pu"in un ele-
ment pozitiv n #irul dat #i cel pu"in un element negativ, astfel nct s! fie asigurat! ge-
nerarea a cel pu"in a unei solu"ii de lungime 2. Dac! n #irul dat nu se g!se#te cel pu"in
un element pozitiv #i cel pu"in un element negativ, n fi#ierul de ie#ire se va scrie me-
sajul 'imposibil'.

Subalgoritm Validare(a,n):
i % 1 { verific"m dac" exist" cel pu!in un element pozitiv }
ct timp (i & n) "i (a[i] & 0) execut!:
i % i + 1 { ct timp num"rul nu este pozitiv, avans"m }
sfr"it ct timp
okpozitiv % i & n { am g"sit cel pu!in un num"r pozitiv? }
i % 1 { verific"m dac" exist" cel pu!in un element negativ }
ct timp (i & n) "i (a[i] ' 0) execut!:
i % i + 1 { ct timp num"rul nu este negativ avans"m }
sfr"it ct timp
oknegativ % i & n { am g"sit cel pu!in un num"r negativ? }
{ dac" avem cel pu!in un element pozitiv #i cel pu!in unul negativ }
{ vom avea cel pu!in o solu!ie }
Validare % okpozitiv "i oknegativ
sfr"it subalgoritm

19. Metoda backtracking 379

Condi"iile de continuare se verific! ntr-un alt subalgoritm, unde ne asigur!m c!:
elementul care se adaug! pe pozi"ia k nu a mai fost introdus n #irul solu"ie;
dac! se adaug! un element pozitiv pe pozi"ia k, atunci elementul de pe pozi"ia k 1
nu va fi tot pozitiv;
dac! se adaug! un element negativ pe pozi"ia k, atunci elementul de pe pozi"ia k 1
nu va fi tot negativ;
indicii trebuie s! apar! n ordine cresc!toare, astfel nct n solu"ii s! se p!streze or-
dinea numerelor din #irul ini"ial, a#a cum cere problema.

Dac! n urma execu"iei subalgoritmului de mai jos valoarea aleas! pe pozi"ia k este
acceptat!, subalgoritmul Posibil(k) returneaz! adev"rat, n caz contrar fals. Cazul
n care k = 1 (gener!m prima component! din solu"ie) se va trata cu aten"ie, deoarece
n aceast! situa"ie nu exist! x[k-1].

Subalgoritm Posibil(k):
i % 1
ct timp (i & k-1) "i (x[i] ( x[k]) execut!:
i % i + 1 { dac" x[k] a fost inclus deja n solu!ie nu l mai putem pune }
Posibil % i > k-1
sfr"it ct timp
dac! (k > 1) "i (a[x[k-1]] > 0) "i (a[x[k]] > 0) atunci
{ dac" n fa!a lui a[x[k]] (num"r pozitiv) avem tot un num"r pozitiv, nu l punem }
Posibil % fals
ie#ire for!at" din subprogram
sfr"it dac!
dac! (k > 1) "i (a[x[k-1]] < 0) "i (a[x[k]] < 0) atunci
{ dac" n fa!a lui a[x[k]] (num"r negativ) avem tot un num"r negativ, nu l punem }
Posibil % fals
ie#ire for!at" din subprogram
sfr"it dac!
dac! (k > 1) "i (x[k-1] > x[k]) atunci
Posibil % fals { dac" indicele x[k] este mai mic dect cel din fa!a lui }
ie#ire for!at" din subprogram
sfr"it dac!
{ dac" am ajuns pn" aici, alegerea lui x[k] este posibil" }
Posibil % adev"rat
sfr"it subalgoritm

Afi#area unei solu"ii se realizeaz! scriind elementele tabloului a corespunz!toare
indicilor da"i n #irul x. Deoarece #irurile solu"ie au lungime variabil!, trebuie transmis
ca parametru #i lungimea k a lor.

380 19. Metoda backtracking

Subalgoritm ScrieSolu!ie(k)
pentru i=1,k execut!
scrie a[x[i]]
sfr"it pentru
sfr"it subalgoritm

n subalgoritmul care realizeaz! pa#ii metodei backtracking:
valoarea lui x
k
este mai mic! sau egal! cu n, x
k
reprezentnd un indice din #irul a;
afi#area se face atunci cnd k = q, unde variabila q este ini"ializat! n programul
principal, ea lund valori ntre 2 #i n #i o folosim pentru a putea genera sub#iruri de
lungimi variabile.

Subalgoritm Back(q):
k % 1
x[k] % 0
ct timp k > 0 execut!:
ok % fals { nc" nu am g"sit valoarea curent" a solu!iei }
ct timp (x[k] < n) "i nu ok execut!:
x[k] % x[k]+1
ok % Posibil(k) { verific"m dac" x[k] poate fi pus n solu!ie }
sfr"it ct timp
dac! nu ok atunci
k % k 1 { c"ut"m alt" valoare pentru elementul precedent }
altfel
dac! k = q atunci { dac" avem q elemente n solu!ie, o scriem }
ScrieSolu!ie(k)
altfel
k % k + 1 { dac" nu, preg"tim urm"torul element }
x[k] % 0
sfr"it dac!
sfr"it dac!
sfr"it ct timp
sfr"it subalgoritm

Programul principal con"ine secven"a de mai jos care asigur! verificarea existen"ei
cel pu"in a unei solu"ii #i lansarea n execu"ie a subprogramelor descrise mai sus.

...
dac! Validare(a,n) atunci
pentru q=2,n execut!:
Back(q)
sfr"it pentru
altfel scrie 'imposibil'
sfr"it dac!
...
19. Metoda backtracking 381

19.5.2. Rechizite
Deoarece n problem! se cer toate modalit!"ile de cheltuire a sumei S, o vom rezolva
prin metoda backtracking. Problema revine la a scrie un num!r ntreg sub forma unei
sume de termeni numere ntregi, adic! suma S dat! trebuie descompus! n func"ie de
restric"iile impuse n enun"ul problemei.
Tabloul solu"ie x va con"ine pe pozi"ia i num!rul de obiecte de papet!rie de tipul i,
pe care elevul le cump!r!; cu alte cuvinte i reprezint! indicele din tabloul de articole
de papet!rie #i x
i
reprezint! cantitatea din articolul avnd indicele i.
n rezolvare folosim un subalgoritm care calculeaz! costul total al produselor cum-
p!rate pn! la inclusiv pasul curent k.

Subalgoritm Suma(k):
sum % 0
pentru i=1,k execut!:
{ x[i] buc"!i din produsul care cost" bani[i] }
sum % sum + x[i] * bani[i]
sfr"it_pentru
Suma % sum
sfr"it subalgoritm

n algoritm se verific! la fiecare pas dac! cheltuielile realizate pn! la pasul curent
nu dep!#esc suma de bani pe care o are elevul la dispozi"ie. Acest test se realizeaz! n
cadrul unui subalgoritm de validare.

Subalgoritm Posibil:
Posibil % Suma(k) & s
sfr"it subalgoritm

Subalgoritmul care implementeaz! metoda backtracking are cteva particularit!"i:
! Fiecare element din #ir (reprezentnd cantit!"i de produse) poate avea ca valoare
maxim! valoarea corespunz!toare din #irul necesar.
! Din moment ce nu este obligatoriu s! se cumpere din fiecare obiect este posibil! #i
cantitatea 0.
! Dac! la un anumit pas costul obiectelor deja cump!rate este egal cu suma de"inut!
de elev, atunci aceasta se consider! a fi o solu"ie #i se scrie n fi#ierul de ie#ire, alt-
fel se ncearc! cump!rarea a nc! unui obiect.

Subalgoritm Back(k):
pentru j=0,necesar[k] execut! { cantit"!i posibile ntre nimic #i maxim }
x[k] % j
dac! Posibil(k) atunci
382 19. Metoda backtracking

dac! suma(k) = s atunci Scrie_sol(k)
altfel
{ exist" n total 7 obiecte din care elevul #i face cump"r"turile }
daca k < 7 atunci
Back(k+1);
sfr"it dac!
sfr"it dac!
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

Dac! nu se poate scrie nici o solu"ie, n fi#ier se va scrie mesajul 'imposibil'.

19.5.3. Expresii
Problema se rezolv! prin metoda backtracking deoarece dorim s! ob"inem toate solu-
"iile care respect! cerin"ele problemei. Pentru aceasta am re"inut valorile operanzilor n
tabloul a. Vom genera toate tablourile x care con"in operatori codifica"i astfel:
1 : adunare
2 : sc!dere
3 : nmul"ire
4 : mp!r"ire
Vom genera un #ir de operatori #i la fiecare ad!ugare a unui operator n #irul x vom
calcula rezultatul curent al expresiei. Dac! operatorul pe care l-am ad!ugat pe pozi"ia k
este 4, adic! urmeaz! s! efectu!m o mp!r"ire, verific!m dac! rezultatul ob"inut este un
num!r ntreg sau nu.
Pentru rezolvare avem nevoie de un subalgoritm care calculeaz! valoarea expresiei
inclusiv la pasul curent k:

Subalgoritm Calcul(k):
s % a[1]
pentru i=1,k execut!:
dac! x[i]=1 atunci s % s + a[i+1]
altfel
dac! x[i]=2 atunci s % s - a[i+1]
altfel
dac! x[i]=3 atunci s % s * a[i+1]
altfel s % s / a[i+1]
sfr"it dac!
sfr"it dac!
sfr"it dac!
sfr"it pentru
Calcul % s
sfr"it subalgoritm
19. Metoda backtracking 383

n programul Pascal variabila local! s #i func"ia Calcul(k) vor fi de tip Real din
cauza c! vom folosi operatorul /.
Condi"iile interne n aceast! problem! au fost definite n enun": toate rezultatele
par"iale trebuie s! fie numere ntregi. Subalgoritmul Posibil(k) va returna adev"rat
n caz afirmativ #i false n caz contrar.

Subalgoritm Posibil(k):
Posibil % nu ((x[k] = 4) "i
((Calcul(k-1)/a[k+1]) ( [(Calcul(k-1)/a[k+1]))]
sfr"it subalgoritm

Algoritmul de backtracking are cteva particularit!"i:
! Elementele din solu"ia x vor avea valori de la 1 la 4, deoarece cei patru operatori s-
au codificat cu cifre.
! Generarea se ncheie atunci cnd s-a ajuns la pasul n 1 #i valoarea expresiei este
egal! cu m.
! Valoarea expresiei se calculeaz! apelnd subalgoritmul Calcul(k) descris mai
sus.
! Dac! nu s-a ajuns la pasul n 1, se continu! generarea.

Subalgoritm Back(k):
pentru i=1,4 execut!: { avem 4 operatori posibili }
x[k] % i { punem un operator n #irul solu!ie }
dac! Posibil(k) atunci { verific"m condi!iile interne }
{ dac" am ob!inut o solu!ie }
dac! (k = n-1) "i (Calcul(k) = m) atunci
Afi"are(x,este) { o afi#"m }
altfel
dac! k < n-1 atunci { dac" mai avem operanzi }
Back(k+1) { ncerc"m s" le plas"m n expresie }
sfr"it dac!
sfr"it dac!
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

n enun"ul acestei probleme se cere ca n cazul n care pentru expresia generat! nu
se poate ob"ine rezultatul m printr-o combina"ie de operatori, s! se afi#eze mesajul
'imposibil'. Atunci cnd afi#!m o solu"ie, schimb!m valoarea variabilei booleene
globale este n adev"rat, urmnd ca n programul principal s! verific!m valoarea
acestei variabile #i s! scriem n fi#ierul de ie#ire mesajul respectiv.
384 19. Metoda backtracking

19.5.4. Ma#inu"e
Aceast! problem! se rezolv! prin metoda backtracking deoarece trebuie generate toate
solu"iile. n aceast! idee vom realiza urm!toarea codificare a datelor:
! x va fi #irul solu"ie #i vom p!stra n x
i
num!rul de ordine al cutiei n care punem
ma#inu"a i;
! n #irul nr
i
p!str!m num!rul (cantitatea) ma#inu"elor puse n cutia i;
! n #irul pus
i
vom avea valoarea adev"rat dac! ma#inu"a i a fost pus! deja n solu"ia
curent!, iar n caz contrar pus
i
va avea valoarea fals.

Exemplu
Fie n = 2 #i m = 3.
x = (1, 1) cu semnifica"ia c! att ma#inu"a 1, ct #i ma#inu"a 2 se introduc n cutia 1;
x = (1, 2) ma#inu"a 1 se introduce n cutia 1 #i ma#inu"a 2 n cutia 2;
x = (2, 1) ma#inu"a 1 se introduce n cutia 2 #i ma#inu"a 2 n cutia 1;
x = (2, 2) ambele ma#inu"e se introduc n cutia 2.

Pentru rezolvarea problemei avem nevoie de un algoritm care verific! condi"iile de
continuare. Am putea num!ra apari"iile fiec!rei cutii pn! la pasul curent k #i am putea
verifica apoi dac! numerele ob"inute nu sunt cumva mai mari dect m. Renun"!m la
aceast! idee #i vom verifica la fiecare pas k, dac! ma#inu"a k nu este pus! deja n vreo
cutie #i dac! cutia n care vrem s-o punem nu este deja plin!, folosindu-ne de #irurile
pus #i nr.

Subalgoritm Posibil(k):
Posibil % (nr[i] < m) "i (nu pus[k])
sfr"it subalgoritm

Afi#area cerut! n enun" are un format special, adic! trebuie s! scriem cuvntul
cutia, apoi num!rul de ordine al cutiei #i dup! ': ' numerele ma#inu"elor care sunt
n acea cutie separate prin cte un spa"iu. Subalgoritmul prin care ob"inem afi#area ce-
rut! este:

Subalgoritm Afi"are(x):
pentru i=1,n execut!:
scrie 'cutia ',i,': '
pentru j=1,n execut!:
dac! i = x[j] atunci scrie j,' '
sfr"it dac!
sfr"it pentru
sfr"it pentru
sfr"it subalgoritm

19. Metoda backtracking 385

Algoritmul de backtracking n form! recursiv! este:

Subalgoritm Back(k):
pentru i=1,n execut!: { putem alege dintre n cutii }
x[k] % i { ncerc"m s" punem ma#inu!a k n cutia i }
dac! Posibil(k,i) atunci { dac" este posibil }
pus[k] % adev"rat { o punem, deci ma#inu!a k este pus" }
nr[i] % nr[i] + 1 { cre#te num"rul ma#inu!elor n cutia i }
dac! k = n atunci { dac" am pus #i a n-a ma#inu!" }
Afi"are(x) { avem o solu!ie, o afi#"m }
altfel
Back(k+1) { n caz contrar ncerc"m s" plas"m urm"toarea ma#inu!" }
sfr"it dac!
pus[k] % fals { la revenire scoatem ma#inu!a k din cutia i, }
nr[i] % nr[i] 1 { deci descre#te num"rul ma#inu!elor n cutia i }
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

n aceast! implementare a metodei backtracking am nlocuit traversarea #irului so-
lu"iei cu scopul de a verifica dac! o anumit! component! nu este deja prezent! n solu-
"ie, prin utilizarea #irului de valori logice pus. n plus, pentru o mai u#oar! verificare a
spa"iului ocupat n cutii, ne-am folosit de #irul nr. Ceea ce apare ca element nou din
aceast! cauz! se poate formula n felul urm!tor: n momentul alegerii unei componen-
te din spa"iul solu"iilor posibile pentru solu"ia curent!, toate entit!"ile care sunt atin-
se de aceast! alegere se modific! n mod corespunz!tor (pus[k] devine adev"rat,
nr[i] cre#te), iar n momentul revenirii dintr-un apel recursiv aceste valori se restau-
reaz! la starea anterioar! (pus[k] devine fals, nr[i] descre#te), deoarece renun"!m
la valoarea componentei k #i astfel toate modific!rile f!cute din cauza alegerii acesteia
la pasul precedent se anuleaz!. Aceast! abordare accelereaz! algoritmul, deoarece n
loc s! travers!m un #ir, adres!m direct un element (valoare logic!). Astfel evit!m
generarea inutil! a multor solu"ii care ulterior s-ar dovedi a fi neinteresante (incorecte).

19.5.5. Depozit
n problema dat! depozitul se memoreaz! printr-un tablou bidimensional.

Exemplu
Fie n = 10. n figura urm!toare depozitul codificat cu tabloul de numere se poate
vedea n stnga, iar vizualizat mai sugestiv n dreapta:

386 19. Metoda backtracking

0 0 0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 1 1 0
0 2 0 0 1 0 0 1 1 0
0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 0 1 0 3 1 2 0 0
0 1 0 1 0 0 0 1 0 0
0 1 2 1 0 2 0 0 0 0
0 0 1 0 0 0 1 1 0 0
0 1 0 1 0 0 0 0 0 0

O
O O O
F O O O
O
O
O O M O F
O O O
O F O F
O O O
O O E
n figur! sunt marcate compartimentele
incendiate, compartimentele n care se afl!
obstacole, locul unde se afl! magazionerul
#i ie#irea.
Enun"ul problemei precizeaz! c! nu se
poate trece prin zonele vecine incendiului.
Zone vecine cu focul (pe baza enun"ului)
sunt toate c!su"ele nvecinate pe orizontal!,
vertical! #i diagonal!. Prin urmare, vom mar-
ca aceste zone ca fiind ocupate de obstaco-
le. Depozitul arat! acum n felul urm!tor:
O
O O O O O
O F O O O O
O O O O
O O O O
O O M O F O
O O O O O O O O
O F O O F O
O O O O O O O
O O E


n secven"a de algoritm care realizeaz! aceast! prelucrare a depozitului folosim #irul
deplasamentelor indicilor de linie #i de coloan! ca n problema Biliard (capitolul 6).

x=(-1,-1,0,1,1,1,0,-1)
y=(0,1,1,1,0,-1,-1,-1)

Subalgoritm Citire(a,n,i0,j0):
cite"te n { dimensiunea depozitului }
pentru i=1,n execut!:
pentru j=1,n execut!:
cite"te a[i,j] { con!inutul depozitului }
pentru i=1,n execut!: { c"ut"m pozi!iile incendiate }
pentru j=1,n execut!:
dac! a[i,j] = 2 atunci
pentru k=1,8 execut!: { cele 8 pozi!ii vecine }
ii % i + x[k]
jj % j + y[k]
19. Metoda backtracking 387

dac! (ii # {1,2,...,n}) "i (jj # {1,2,...,n}) atunci
{ dac" pozi!ia vecin" este n interiorul depozitului }
a[ii,jj] % 1 { o consider"m de asemenea ocupat" }
altfel
dac! a[i,j] = 3 atunci
i0 % i { pozi!ia n care se afl" magazionerul }
j0 % j
sfr"it dac!
sfr"it dac!
sfr"it pentru
sfr"it dac!
sfr"it pentru
sfr"it pentru
sfr"it subalgoritm

Coordonatele ini"iale ale magazionerului (i0 #i j0) le determin!m din datele depo-
zitului.
Magazionerul poate traversa depozitul, avansnd dintr-o pozi"ie n alta care este ve-
cin! pe orizontal! sau vertical! cu cea n care se afl!. Vom preg!ti #irul deplasamente-
lor indicilor de linie #i de coloan! ca n problema Biliard, de data aceasta din patru
componente:
x=(1,0,1,0) #i y=(0,1,0,1).
Dac! magazionerul se afl! n pozi"ia marcat! cu M, #irul x con"ine valori care tre-
buie adunate valorii indicelui de linie a pozi"iei magazionerului pentru a ajunge pe li-
niile vecine, iar y con"ine valori care trebuie adunate valorii indicelui de coloan! a po-
zi"iei magazionerului pentru a ajunge pe coloanele vecine (marcate cu 1, 2, 3 #i 4 n fi-
gura de mai jos).
1
4 M 2
3

Condi"iile interne sunt precizate n enun" sub forma restric"iilor n deplasare. Aces-
tora se adaug! #i condi"ia de a nu ie#i din depozit n alt! parte dect este ie#irea pro-
priu-zis!:
! coordonatele nc!perii n care se trece trebuie s! fie ntre 1 #i n;
! n nc!perea n care se face deplasarea nu poate exista obstacol sau foc;
! prin nc!perea n care se trece la pasul curent acest drum nu a trecut nc!.

Aceste condi"ii sunt verificate n subalgoritmul Posibil (a este tabloul n care se
memoreaz! depozitul, iar b este tabloul care re"ine drumul parcurs de magazioner):


388 19. Metoda backtracking

Subalgoritm Posibil(i,j):
{ presupunem c" se poate efectua pas n nc"perea de coordonate (i,j) }
Posibil % adev"rat
dac! nu (i # {1,2,...,n}) sau nu (j # {1,2,...,n}) atunci
{ dac" nc"perea se afl" n afara depozitului, pasul nu este posibil }
Posibil % fals
sfr"it dac!
dac! a[i,j] ( 0 atunci
{ dac" pozi!ia este ocupat" de obstacol sau este cuprins" de incendiu }
Posibil % fals
sfr"it dac!
dac! b[i,j] ( 0 atunci { dac" s-a mai trecut pe aici }
Posibil % fals
sfr"it dac!
sfr"it subalgoritm

Subalgoritmul Posibil(i,j) este apelat n algoritmul Back(i,j,pas), atunci
cnd, la pasul pas, din pozi"ia (i,j) se ncearc! trecerea ntr-o nou! pozi"ie (ii,jj).

Subalgoritm Back(i,j,pas):
pentru k=1,4 execut!: { se ncearc" deplas"rile n cele 4 pozi!ii vecine }
ii % i + x[k] { se determin" indicele de linie a pozi!iei vecine }
jj % j + y[k] { se determin" indicele de coloan" a pozi!iei vecine }
dac! Posibil(ii,jj) atunci { dac" pasul n aceast" pozi!ie este posibil }
b[ii,jj] % pas { se efectueaz" pasul }
dac! ((ii=n) "i (jj=n)) atunci { dac" pozi!ia curent" este ie#irea }
afi"are(b) { se afi#eaz" o solu!ie }
altfel { n caz contrar }
Back(ii,jj,pas+1)
{ se ncearc" un pas nou care se efectueaz" din pozi!ia (ii,jj) }
sfr"it dac!
{ la revenire se #terge ultimul pas efectuat din pozi!ia (i,j) n (ii,jj) }
b[ii,jj] % 0{ deoarece din (i,j) vom ncerca s" trecem n alt" pozi!ie }
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

Datele cu care lucreaz! algoritmul Back sunt cunoscute. Mai r!mne s! interpre-
t!m modul n care acesta lucreaz!.
! Se determin! coordonatele pozi"iei n care urmeaz! s! treac! magazionerul:
(ii,jj).
19. Metoda backtracking 389

! Se verific! condi"iile de continuare prin apelarea algoritmului Posibil(ii,jj).
! Dac! sunt ndeplinite condi"iile de continuare, deci Posibil(ii,jj) are valoarea
adev"rat, atunci pasul curent se trece n tabloul b care re"ine drumul parcurs spre
ie#ire.
! Dac! s-a ajuns n col"ul din dreapta-jos, atunci se face afi#area tabloului b, altfel se
continu! deplasarea.


O solu"ie pentru exemplul considerat
este vizualizat! n figura urm!toare. Ob-
serv!m c! traseul trece inutil prin pozi-
"iile 49, dar acest lucru nu constituie
gre#eal! din moment ce nu s-au cerut
trasee de lungime minim!.
6 7 O
O O O 5 8 O O
O F O O 4 9 O O
O O O O 3 10 11 12 13
O 2 O O O 14
O O 1 O F O 15
O O O O O O O O 16
O F O O F O 17
O O O O O O O 18
O O 19

19.5.6. Cal #i nebun pe tabla de #ah
n figura de mai jos sunt ha#urate pozi"iile pe care bate nebunul cnd se afl! pe pozi"ia
N avnd coordonatele (2, 4). Calul se afl! ini"ial n pozi"ia de start marcat! cu C (2, 2)
#i trebuie s! ajung! n pozi"ia final! F (5, 5). El are dou! trasee de aceea#i lungime mi-
nim! pentru a ajunge n pozi"ia final!, si anume:
(2, 2)(3, 4)(5, 5)
(2, 2)(4, 3)(5, 5)

C N
2
2
F


Prima observa"ie pe care o facem se refer! la faptul c! n enun" se cer toate solu"iile
problemei care corespund cerin"elor. n acest moment #tim c! metoda de rezolvare va
fi backtracking. Analiznd cerin"ele, constat!m c! trebuie s! determin!m un minim. n
aceast! problem! minimul nu este doar un num!r (care de altfel nici nu trebuie afi#at
la ie#ire), ci un #ir de coordonate de pe tabla de #ah care corespund traseului de lungi-
me minim". n plus, se cer toate aceste #iruri.
390 19. Metoda backtracking

Prima idee ar fi s! stabilim (conform algoritmului clasic) un astfel de minim, apoi
s! afi#!m toate solu"iile care corespund acestuia. Astfel ar trebui s! efectu!m algorit-
mul realizat cu metoda backtracking o dat! pentru stabilirea tuturor solu"iilor, re"innd
valoarea minim! a traseului, apoi s! execut!m nc" odat" acela#i algoritm pentru g!si-
rea tuturor solu"iilor (traseelor) avnd lungimea minim!.
Este evident c! o astfel de solu"ie nu este acceptabil!, deoarece ar conduce la un
timp de execu"ie mult prea mare. Analiznd n continuare problema, ajungem la con-
cluzia c! trebuie s! g!sim o modalitate care nu execut! integral procedura care imple-
menteaz! metoda backtracking de dou! ori.
Mai nti ne propunem s! g!sim o rezolvare n care s-o execut!m o singur! dat!.
Dac! am putea stabili minimul #irului, traversndu-l o singur! dat!, am g!sit simplifi-
carea pe care ne-am propus-o.
n urm!torul algoritm presupunem c! se caut! (mai simplu) toate pozi"iile din #irul
x pe care se afl! valoarea minim! a #irului x. Rezultatul se va furniza programului
apelant n #irul rez de lungime j:

Subalgoritm Minim(n,x,j,rez):
min % x[1]
j % 1
rez[j] % 1
pentru i = 2, n execut!
dac! min > x[i] atunci
j % 1
rez[j] % i
min % x[i]
altfel
dac! min = x[i] atunci
j % j + 1
rez[j] % i
sfr"it dac!
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

Dar n cazul nostru trebuie re"inute solu"ii care sunt #iruri de coordonate #i nu doar
indici. Alegem alt! cale de rezolvare. Vom scrie rezultatul curent n fi#ier #i atunci
cnd g!sim unul care corespunde aceluia#i minim, deschidem fi#ierul cu Append #i l
scriem, iar cnd g!sim o solu"ie corespunz!toare unui minim mai mic dect cel curent,
deschidem fi#ierul cu ReWrite, astfel ncepnd scrierea grupului nou de solu"ii.
Se poate observa c! pe lng! aceast! modalitate mai exist! #i altele care rezolv!
problema. De exemplu, putem presupune c! traseul minim are lungimea minim! 1.
Apel!m procedura Back(i,j,pas) #i c!ut!m trasee avnd aceast! lungime. Dac! g!-
19. Metoda backtracking 391

sim un astfel de traseu, l scriem n fi#ier, dac! nu, atunci m!rim valoarea minimului la
2 #i c!ut!m trasee avnd aceast! lungime. Algoritmul se opre#te, evident, atunci cnd
am g!sit cel pu"in o solu"ie care corespunde minimului presupus la pasul respectiv.
Suntem siguri c! astfel g!sim solu"iile corespunz!toare minimului, deoarece am luat n
considerare valorile posibile n ordine cresc!toare. Acest algoritm este urm!torul:

Subalgoritm Minim:
min % 2
ok % fals
repet!
Back(x0,y0,2,min,ok)
min % min +1
pn! cnd ok
sfr"it algoritm

Solu"ia o vom codifica ntr-un tablou t, corespunz!tor tablei de #ah, ini"ializndu-i
elementele cu 0. Atunci cnd n c!utarea solu"iei efectu!m un pas permis ntr-o anumi-
t! pozi"ie, valoarea acelui element va fi egal! cu num!rul de ordine al pasului. Evi-
dent, la revenire vom avea grij! s! restabilim valoarea ini"ial! a elementului respectiv
pentru ca n timpul gener!rii unei solu"ii noi s! putem efectua un pas n aceast! pozi"ie.
n procedura Back(i,j,pas) vom genera pozi"iile (ii,jj) corespunz!toare pa-
#ilor noi pe care un cal le poate efectua dintr-o pozi"ie curent! (i,j) cu ajutorul a
dou! #iruri de constante (di #i dy) care reprezint! deplasamentele liniilor, respectiv
coloanelor celor 8 pozi"ii n care poate s!ri un cal.

sir=array[1..8] of -2..2;
const di:sir=(-2,-1,1,2,2,1,-1,-2);
dj:sir=(1,2,2,1,-1,-2,-2,-1);

Pentru fiecare astfel de pozi"ie nou!, vom verifica dac! ea se afl! sau nu pe tabla de
#ah (if (ii in [1..n]) and (jj in [1..n])).

Dac! ne afl!m pe tabl!, vom verifica dac! aceast! pozi"ie este n afara b!t!ii nebu-
nului (aflat n pozi"ia (x,y) cu instruc"iunea if (Abs(x-ii) <> Abs(y-jj)). Tot-
odat! verific!m #i elementul corespunz!tor din tabloul t. Dac! acest element are va-
loarea 0, nseamn! c! nc! nu a fost inclus n traseu, deci putem efectua un pas aici.
Acum vom verifica dac! aceast! pozi"ie nu este cumva cea final!, caz n care urmeaz!
s! ne convingem c! lungimea traseului este egal! cu lungimea minim! propus!.
Dac! am atins pozi"ia final! #i num!rul pa#ilor este egal cu min, am ob"inut o solu-
"ie #i o putem afi#a. n caz contrar vom continua traseul nceput, dar numai dac" nu-
m"rul de ordine al pasului curent este mai mic dect lungimea minim" propus", deoa-
392 19. Metoda backtracking

rece nu are sens s! determin!m solu"ii care conduc la o lungime mai mare dect cea
propus! din moment ce acestea nu se valorific!.
n concluzie, algoritmul recursiv care implementeaz! metoda backtracking este ur-
m!torul:

Subalgoritm Back(i,j,pas):
pentru k=1,8 execut!:
ii % i + di[k] { indicele de linie a pozi!iei noi }
jj % j + dj[k] { indicele de coloan" a pozi!iei noi }
{ dac" pozi!ia aleas" este pe tabl" }
dac! (ii # {1,2,...,n}) "i (jj # {1,2,...,n}) atunci
dac! ()x-ii*) ( )y-jj*) "i (t[ii,jj] = 0) atunci
{ dac" pozi!ia nu se afl" pe traiectoriile nebunului #i }
{ n aceast" pozi!ie nu am trecut la un pas anterior }
t[ii,jj] % pas { efectu"m pasul (marc"m pozi!ia) }
{ dac" am ajuns n pozi!ia final" }
dac! (ii = x1) "i (jj = y1) atunci
{ dac" num"rul pa#ilor efectua!i este egal cu minimul }
dac! pas = min atunci
Afi"are(t)
ok % adev"rat
sfr"it dac!
altfel
dac! pas < min atunci
{ dac" num"rul pa#ilor efectua!i este mai mic dect minimul curent }
Back(ii,jj,pas+1) { continu"m drumul }
sfr"it dac!
sfr"it dac!
t[ii,jj] % 0
{ #tergem urma pasului efectuat, deoarece am revenit la o stare anterioar" }
sfr"it dac!
sfr"it dac!
sfr"it pentru
sfr"it subalgoritm

Afi#area rezultatului se realizeaz! pe baza valorilor diferite de zero din tabloul t.
Deoarece #tim c! num!rul acestor elemente este min (accesibil!, deoarece algoritmul
s-a terminat cnd am g!sit un traseu avnd cea mai mic! valoare), n tabloul t vom
c!uta valori cuprinse ntre 1 #i min, n aceast! ordine afi#nd indicii de linie #i de co-
loan! a acestora.


19. Metoda backtracking 393

Subalgoritm Afi"are(t):
k % 1
ct timp k & min execut!
pentru i=1,n execut!
pentru j=1,n execut!
dac! t[i,j] = k atunci
scrie i, j
k % k + 1
sfr"it dac!
sfr"it pentru
sfr"it pentru
sfr"it ct timp
sfr"it subalgoritm