You are on page 1of 8

PREZENTAREA TEHNICII BACKTRACKING:

Aceasta tehnica se foloseste in rezolvarea problemelor care indeplinesc simultan


urmatoarele conditii:
Solutia lor poate fi pusa sub forma unui vector S=x1x2,..,xn cu x1 A1, x2 A2,
.., xn An ;
ultimile A1, A2, .., An sunt multimi finite, iar elementele lor se considera ca se
afla intr!o relatie de ordine bine stabilita;
"u se dispune de o alta metoda de rezolvare, mai rapida;
Aceasta tehnica presupune trei functii:
1. #unctia de citire a valorile cunoscute;
2. #unctia de tiparire a solutiilor;
$. #unctia bac%trac%in&.
Schema &enerala a procedurii bac%trac%in&:
'oid bac% (int %)
*nt *, cont;
+
if (%=n,1) tipar ( );
else for (i=1; i=n; i,,)
+
a-%.=i;
cont=1;
pentru cazul prost /0"1 ia valoarea #A2S: cont=3;
if (cont = = 1) bac% (%,1);
4
4
5ro&ramele prezentate mai 6os, in pseudocod, sunt:
5aranteze;
/omis!voia6or;
7ame;
Submultimi;
a&azin;
5ermutari.
PROGRAME IN PSEUDOCOD
1. 5aranteze: se da un numar natural par n. Sa se determine toate sirurile de n paranteze
care se inchid corect.
procedura tipar
6 nr natural
pentru p 8 ! 1,n executa 99 afisarea solutiilor
daca a-p.8!1
atunci scrie :); 99 conditie pt afisarea parantezelor inchise
99 de la daca
altfel scrie :(;
99 de la pentru
procedura bac% (% nr natural)
cont, i, d, 6 nr naturale
daca %=n,1 99 conditie pentru afisare
atunci tipar
99 de la daca
altfel pentru i 8!3,1 executa
a-%.8!1
cont 8!1
daca %=1
atunci daca a-%.=1
atunci cont 8! 3 99 conditie pentru panateza (
99 de la daca a-%.=1
99 de la daca %=1
daca %=n
atunci daca a-%.=n
atunci cont 8! 1 99 conditie pentru paranteza )
99 de la daca a-%.=n
99 de la daca %=n
d8!3 99 numara cate paranteze inchise sunt
pentru 6 8!1,% executa 99 de la 1 pana la pozitia la care s!a a6uns executa
daca a-6.=3
atunci d 8! d,1 99 daca &aseste o paranteza inchisa atunci d creste
99 de la daca
99 de la pentru (6)
daca d<n92
atunci cont 8! 3 99 conditie pt ca nr. de paranteze inchise sa nu fie mai mare de n92
99 de la daca
daca %!d<d
atunci cont 8! 3 99 conditie pt ca diferenta dintre pozitia la care s!a a6uns (%) si nr.
de paranteze inchise
sa nu fie mai mare de numarul de paranteze inchise
99 de la daca
daca cont=1
atunci bac% (%,1) 99 apelarea recursiva a procedurii bac% (cu parametru )
99de la daca
99de la pentru (i)
pro&ramul principal
se citeste n ( n nr natural )
bac% (1) 99 apelarea procedurii bac% pentru %=1
exemplu:
date de intrare: n==
date de iesire : ( ( ( ) ) ), ( ( ) ( ) ), ( ) ( ) ( ), ( ) ( ( ) ), ( ( ) ) ( )

2. >n comis voia6or porneste din orasul 1 si trebuie sa treaca prin toate cele n!1 orase
ramase astfel incat sa nu treaca de 2 ori prin acelasi oras si sa se intoarca in orasul 1.
Se citesc le&aturile dintre cele n orase cu a6utorul unui matrice de adiacenta cu n linii
si n coloane.
procedura tipar
6 nr natural
pentru 6 8! 1,n executa 99 tiparirea solutiilor
scrie a-6.
// de la pentru
procedura bac% (% nr intre&)
i,t,cont nr intre&i
daca %=n,1 99 conditie pt tiparirea solutiilor
atunci tipar
99 de la daca
altfel
pentru i 8! 1,n executa
a-%. 8! i
cont 8!1
daca %<1
pentru t 8!1,%!1
daca a-%.=a-t. 99 conditie pt orase distincte
atunci cont 8! 3
99 de la daca
99 de la pentru (t)
daca a-m-%!1.-%.. =3 99 conditie pt ca intre 2 orase sa existe drum
atunci cont 8! 3
99 de la daca
daca a-m-n.-1..=3 99 conditie pt ca intre ultimul si primul oras sa existe drum
atunci cont 8! 3
99 de la daca
99 de la daca (%<1)
daca cont=1
atunci bac%(%,1) 99 apelarea recursiva a procedurii bac% (cu parametru )
99 de la daca
99 de la pentru (i)
pro&ram principal
citeste n (n nr natural)
pentru b8!1,n (b nr natural) 99 citirea matricei de adiacenta
pentru c8! 1,n (c nr natural)
scrie m-b.-c. (valori naturale)
99 de la pentru (c8!1,n)
99 de la pentru (b8!1,n)
bac%(1) 99 apelarea procedurii bac% (pt %=1)
exemplu :
date de intrare : ?
3 1 1 1
1 3 1 1
1 1 3 1
1 1 1 3
date de iesire : 1 2 $ ?
1 $ 2 ?
$. Se dau n dame si se cere sa fie asezate pe o tabla de sah (n x n ) astfel incat ele sa nu
se atace.
procedura tipar
i nr natural
pentru i 8! 1,n executa 99 tiparirea solutiilor
scrie a-i.
99 de la pentru
procedura bac% (% nr intre&)
t, i, cont nr intre&i
daca %=n,1 99 conditie pt tiparirea solutiilor
atunci tipar
99 de la daca
altfel
pentru i 8!1,n executa
a-%.8!i
cont8!1
daca %<1
pentru t 8!1,%!1 executa
daca a-%.=a-t. sau a-%.!a-t. = %!t 99 conditii pt ca damele sa nu se atace
atunci cont 8!3
99 de la daca
99 de la pentru (t)
99 de la daca (%<1)
daca cont 8!1
atunci bac%(%,1) 99 apelarea recursiva a procedurii bac% ( cu parametru )
99 de la daca
99 de la pentru (i)
pro&ram principal
citeste n (nr natural)
bac% (1) 99 apelarea procedurii bac% (pt %=1)
exemplu :
date de intrare : ?
date de iesire : 2 ? 1 $
$ 1 ? 2
?. Aflati toate submultimile care sunt incluse intr!o multime data. Se citesc nr de
elemente ale multimii si elementele sale.
procedura tipar
6 nr natural
pentru 6 8! 1,n executa
daca a-6.=1 99 conditie pt tiparirea solutiilor
scrie m-6. 99 tiparirea solutiilor
99 de la daca
99 de la pentru
procedura bac% (% nr natural)
cont, i nr naturale
daca %=n,1 99 conditie pt tiparirea solutiilor
atunci tipar
99 de la daca
altfel
pentru i 8! 3,1 executa
a-%. 8!i
cont 8!1
daca cont =1 99 nu sunt conditii de continuare
atunci bac% (%,1) 99 apelarea recursiva a procedurii bac% ( cu paremetru )
99 de la daca
99 de la pentru
pro&ramul principal
citeste n ( nr natural )
pentru x 8!2,n (x nr natural)
citeste m-x. ( valori naturale)
99 de la pentru
bac%(1) 99 apelarea procedurii back (pt k=1)
exemplu :
date de intrare : $
1 ? @
date de iesire : @, ?, ? @, 1, 1 @, 1 ?, 1 ? @
A. >n copil intra intr!un ma&azin de 6ucarii. Bl are o suma s de bani si doreste sa!si
cumpere cat mai multe 6ucarii. Sa se cate produse diferite poate cumpara copilul
stiind ca in ma&azin se afla n produse, fiecare avand cate un pret dat.
procedura tipar (% nr natural)
pentru i 8! 1,%!1 executa
scrie a-i. 99 tiparirea solutiilor
99 de la pentru
procedura bac%(% nr natural, suma nr intre&)
t, i, cont nr naturale
daca s=suma 99 conditia pt tiparirea solutiilor
atunci tipar(%) 99 apelarea procedurii tipar (cu parametru )
99 de la daca
altfel
pentru i 8! 1,n executa
a-%.8!i
cont8!1
daca %<1
pentru t 8!1, %!1
daca a-%.8=a-t. 99 conditie pt a nu se repeta produsele in cadrul aceleiasi solutii
atunci cont 8!3
99 de la daca
99 de la pentru (t)
99 de la daca (%<1)
daca suma<s 99 conditie pt ca preturile produselor (suma) 8 suma disponibila (s)
atunci cont 8!3
99 de la daca
daca cont=1
atunci bac%(%,1, suma,p-a-%..) 99 apelarea recursiva a procedurii bac%
99 suma,p-a-%.. reprezinta suma anterioara , pretul produsului a-%.
99 de la daca
99 de la pentru (i)
pro&ramul principal
citesc s (nr intre&)
citesc n (nr natural)
pentru 6 8! 1,n executa
citesc p-6. (valori intre&i) 99 se citesc preturile produselor
99 de la pentru
bac% (1,3) 99 apelarea procedurii bac% (pt %=1 si suma=3)
exemplu :
date de intrare : 133, A
A, C3, 1A, 23, CA
date de iesire : 1 2 $
2 ?
$ A
5roblema clasicD de pro&ramare care necesitD bac%!trac%in& (revenirea pe urma lDsatD)
este problema ieEirii din labirint:
Se iniFializeazD labirintul Gn mod static, ca o matrice de caractere (:H; zid si : : drum)
Iinclude
Iinclude
Iinclude
Idefine JAJ =
Idefine KAJ =
char a-JAJ,1.-KAJ,1.=+
:HHHHHHH;,
:H H H;,
:H H H H;,
:H H HHHH;,
:HH H H;,
:H H :,
:HHHHHHHH;
4;
int x3=1,L3=2;
void print(void)+
int i,6;
for(i=3;i8=JAJ;i,,)+
for(6=3;68=KAJ;6,,)putchar(a-i.-6.);
putchar(MNnM);
4
&etchar();clrscr();
4
void escape(int x,int L)+
if(x==JAJ OO L==KAJ)+ puts(PSuccesQP);exit(1);4
a-x.-L.=MHM;print();
if(a-x.-L,1.==M M)+puts(Pla dreaptaP);escape(x,L,1);4
if(a-x,1.-L.==M M)+puts(Pin 6os P);escape(x,1,L);4
if(a-x.-L!1.==M M)+puts(Pla stin&a P);escape(x,L!1);4
if(a-x!1.-L.==M M)+puts(Pin sus P);escape(x!1,L);4
return;
4
void main(void)+
escape(x3,L3);
puts(P1rapedQP);
4

You might also like