Sunteți pe pagina 1din 32

Metoda Backtracking Prof.

Kabai Timea
Metoda Backtracking
Metoda Backtracking este o metod general de elaborare a algoritmilor.
Aceast metod se aplic problemelor n care :
soluia se poate reprezenta sub form de vector S=(x
1
x
!
"x
n
# cu x
1
A
1
x
!
A
!
" x
n
A
n
mulimile A
1
A
!
" A
n
sunt mulimi finite iar elementele lor se consider c se afl ntr$o relaie de
ordine bine stabilit
Am artat c orice soluie se genereaz sub form de vector. %om considera c generarea soluiilor se face ntr$
o stiv. Astfel x
1
A
1
se va gsi pe primul nivel al stivei x
!
A
!
se va gsi pe al doilea nivel al stivei... x
&
A
&

se va gsi pe nivelul & al stivei. 'n general stiva (notat st# va arta ca mai (os:
x
&
...
...
x
!
st x
1
)ivelul &*1 al stivei trebuie iniializat (pentru a alege n ordine elementele mulimii &*1#. +niializarea
trebuie fcut cu o valoare aflat ( n relaia de ordine considerat pentru mulimea A
&*1
# naintea tuturor
valorilor posibile din mulime.
EXEMPLU. Generarea permutrilor. Se cite,te un numr natural n. S se genereze toate permutrile
mulimii {1, 2, ... n}. -rice nivel al stivei va lua valori de la 1 la n.
+niializarea unui nivel (oarecare# se face prin valoarea 0.
.entru n=3 permutrile sunt:
123
132
213
231
312
321
.entru aceast problem A
1
=A
!
=A
/
=01!/1. 2e exemplu permutarea /!1 este scris sub form de vector
unde /A
1
!A
!
1A
/.
Principiul metodei.
2ac n procesul de generare a unui vector soluie S=(x
1
x
!
"x
n
# pentru componenta & atunci c3nd am generat
de(a x
1
x
!
"x
&
constatm c valoarea x
&
nu este bine aleas nu trecem componenta &*1 ci relum cutarea
pentru alt valoare pentru componenta & iar dac aceast valoare nu exist relum cutarea pentru componenta
&$1.
2up ce am analizat posibilele valori pe care le poate lua componenta & avem dou posibiliti: ori trecem la
componenta &*1 (facem pasul nainte# ori mergem la componenta &$1 (facem pasul napoi#
1
Metoda Backtracking Prof. Kabai Timea
4omponentele vectorului S sunt generate pe r3nd ca n figura de mai (os:
x
1
x
1
x
!
x
1
x
!
x
/
""""..
x
1
x
!
" x
&$1
x
1
x
!
" x
&$1
x
&
""""""""
Observaie.
5e6nica 7ac&trac&ing are ca rezultat obinerea tuturor soluiilor problemei. 'n cazul n care se cere o
singur soluie se poate fora oprirea atunci c3nd a fost gsit.
.entru u,urarea nelegerii metodei vom prezenta o rutin unic aplicabil oricrei probleme rutin care
este elaborat folosind noiunea de stiv. 8utina va apela subprograme care au acela,i nume ,i parametrii ,i
care din punct de vedere al metodei realizeaz acela,i lucru. Sarcina rezolvitorului este s scrie explicit pentru
fiecare problem n parte subprogramele apelate de rutina backtracking.
+niializarea unui nivel (oarecare# se face prin valoarea 9.
.rocedura de iniializare o vom numi init ,i va avea doi parametrii: k nivelul care trebuie iniializat ,i
st (stiva#.
:sirea urmtorului element al mulimii A
k
element netestat se face cu a(utorul procedurii succesor
(as, st, k). .arametrul as ;am succesor ; este o variabil boolean. 'n situaia n care am gsit elementul
acesta este pus n stiv ,i as ia valoarea 58<= contrar (nu a rmas un element netestat# as ia valoarea >A?S=.
-dat ales un element trebuie vzut dac acesta ndepline,te condiiile de continuare (altfel spus dac
elementul este valid#. Acest test se face cu a(utorul procedurii valid (ev, st, k). %ariabila ev este
boolean.
5estul dac s$a a(uns sau nu la soluia final se face cu a(utorul funciei solutie(k).
Soluia se tipre,te cu a(utorul procedurii tipar.
.rezentm rutina bac&trac&ing:
k:=1; init(1, st);
while k>0 do begin
repeat
s!!esor(as, st, k);
i" as then #alid(e#, st, k)
ntil (not as) or (as and e#);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k, st)
end
else k:=k%1
end;
!
Metoda Backtracking Prof. Kabai Timea
EXEMPLU.
@ixt este numele unui magazin cu urmtoarele caracteristici:
Are A eta(e:
$ la eta(ul 1 are 19 raioane cu pantofi
$ la eta(ul ! are 19 raioane cu ciorapi
$ la eta(ul / are 19 raioane cu pantaloni
$ la eta(ul B are 19 raioane cu cm,i
$ la eta(ul A are 19 raioane cu cravate
.resupun3nd c dorim s ne mbrcm de la acest magazin pentru o festivitate adic cumprm:
pantofi, ciorapi, pantaoni, c!"a#! #i cravat!
astfel nc3t acestea s se asorteze ntre ele s se genereze toate modalitile de a ne mbrca.
$E%OL&A$E.
2eoarece soluia are mai multe componente A ; c3te eta(e are magazinul putem folosi metoda bac&trac&ing.
.entru rezolvare vom folosi:
& ; variabil ntreag care reprezint eta(ul pe care ne gsim
x $ vector care are A componente ntregi adic c3te eta(e are magazinul cu proprietatea:
x
&
: reprezint numrul raionului de la care s$a cumprat la eta(ul & n cazul de fa x
&
01
"191 unde & 01"A1
as$ variabil boolean care prime,te valoarea 58<= dac pe eta(ul & mai sunt raioane nevizitate ,i
>A?S= n caz contrar
ev$ variabil boolean care prime,te valoarea 58<= dac ce este la raionul x
&
convine ,i >A?S= n caz contrar
' ( ) * '+
' ( ) * '+
' ( ) * '+
' ( ) * '+
' ( ) * '+

Se pleac de la primul eta(
2in faa u,ii
43t timp ne aflm pe un eta( &
8epet
)e ntrebm dac mai sunt raioane pe eta(ul &
2ac da atunci se verific dac ne convine ce conine raionul care urmeaz
.3n c3nd (s$au terminat raioanele# sau (am gsit ,i ne convine#
2ac am gsit atunci
2ac le$am luat pe toate atunci se afi,eaz
altfel
Se merge la eta(ul urmtor
'n faa u,ii
altfel se coboar la eta(ul de (os
/
1
A
A
&
x
&
Metoda Backtracking Prof. Kabai Timea
Programul generalizat.
program raioane;
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
k,n,e:integer;
e#,as:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succ(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()n then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=e);
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to e do write(st'i(:*);
writeln;
end;
BEGI
write(+,ate raioane a#e-. n=+); readln(n);
write(+,ate eta/e a#e-. e=+); readln(e);
k:=1; init(k,st);
while k>0 do begin
repeat
s!!(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
readln;
B
Metoda Backtracking Prof. Kabai Timea
E!"
E#emplu"
Aplica ii:
1. ,enerarea per"ut!rior. Se cite,te un numr natural n. S se genereze toate permutrile mulimii 01!
... n1.
:enerarea permutrilor se va face in3nd cont c orice permutare va fi alctuit din elemente distincte ale
mulimii A. 2in acest motiv la generarea unei permutri vom urmri ca numerele s fie distincte.
.rezentm algoritmul corespunztor cazului n=/:
1 ! /
1 ! ! ! !
1 1 1 1 1 1
1 ! /
/ / / / 1
1 1 1 1 ! !
1 ! / 1
1 1 1 ! / /
! ! ! ! ! !
se ncarc stiva pe nivelul 1 valoarea 1C
ncrcarea valorii 1 pe nivelul al !$lea nu este posibil ntruc3t aceast valoare se gse,te ,i pe nivelul 1 al
stiveiC
ncrcarea valorii ! pe nivelul al doilea este posibil deoarece aceast valoare nu mai este nt3lnitC
valoarea 1 din nivelul al /$lea se gse,te pe nivelul 1C
valoarea ! de pe nivelul al /$lea se gse,te pe nivelul al !$leaC
valoarea / pe nivelul al treilea nu este nt3lnit pe nivelele anterioareC ntr$uc3t nivelul / este completat
corect tiprim 1 ! /
...
Algoritmul continu p3n c3nd stiva devine vid.
A
Metoda Backtracking Prof. Kabai Timea
program permutari;
t&pe sti#a=arra&'1..100( o" integer;
#ar st: sti#a;
as, e#:boolean;
n,k,i:integer;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()n then begin
st'k(:=st'k($1;
as:=tre;
end
else as:="alse
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
"or i:=1 to k%1 do i" st'k(=st'i( then e#:="alse
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=n)
end;
procedure tipar;
begin
"or i:=1 to n do write(st'i();
writeln;
end;
BEGI
write(+n=+); readln(n);
k:=1; init(k, st);
while (k>0) do begin
repeat
s!!esor(as, st, k);
i" as then #alid(e#, st, k);
ntil (not as) or (as and e#);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st)
end
else k:=k%1
end;
readln;
E!"
D
Metoda Backtracking Prof. Kabai Timea
!. >iind date m cri s se afi,eze toate modalitile de aran(are a acestora pe un raft.
program carti$pe$raft;
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
a:arra&'1..100( o" string;
i,k,-:integer;
e#,as:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succ(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()- then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
"or i:=1 to k%1 do
i" not(st'k()>st'i() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=-);
end;
procedure tipar;
begin
"or i:=1 to k do write(a'st'i((:0);
writeln;
end;
BEGI
,lr1!r;
write(+,ate !arti a#e-. +); readln(-);
"or i:=1 to - do begin
write(+,artea'+,i,+(=+);
readln(a'i();
end;
k:=1;
init(k,st);
while k>0 do begin
repeat
s!!(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
readln;
E
Metoda Backtracking Prof. Kabai Timea
E!"
/. >iind dat mulimea A=01BDEF1 s se genereze toate numerele formate din A cifre distincte care se
pot forma cu elementele mulimii date.
program numere;
ses !rt;
!onst 2:arra&'1..3( o" integer=(1,*,4,0,5);
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
i,k,n:integer;
e#,as:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()3 then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
"or i:=1 to k%1 do
i" not(st'k()>st'i() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=3);
end;
procedure tipar;
begin
"or i:=1 to k do write(a'st'i((:*);
writeln;
end;
BEGI
,lr1!r;
k:=1;
init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
G
Metoda Backtracking Prof. Kabai Timea
end;
readln;
E!"
B. A$A-.AME-/E. S se determine toate modalitile de a aran(a a elementele n grupe de b elemente
distincte b%a.
program aran&amente;
ses !rt;
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
i,k,a,b:integer;
as,e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()a then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
"or i:=1 to k%1 do
i" not(st'k()>st'i() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=b);
end;
procedure tipar;
begin
"or i:=1 to k do write(st'i(:3);
writeln;
end;
BEGI
,lr1!r;
write(+a=+); readln(a); write(+b=+); readln(b);
k:=1; init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
F
Metoda Backtracking Prof. Kabai Timea
end;
readln;
E!"
A. >iind dat mulimea '=(),*,+,,,-., s se genereze toate numerele de 3 cifre distincte care se pot
forma cu elementele mulimii date. 2eterminai numrul ,i numrul celor care se termin n cifra ,.
program numere; {Soluie: nr=60, nr7=12}
!onst 2:arra&'1..3( o" integer=(1,*,4,0,5);
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
i,k,nr,nr0:integer;
as,e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()3 then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
"or i:=1 to k%1 do
i" not(st'k()>st'i() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=3);
end;
procedure tipar;
begin
"or i:=1 to k do write(a'st'i((:3); writeln;
nr:=nr$1;
i" a'st'3((=0 then nr0:=nr0$1;
end;
BEGI
nr:=0; nr0:=0; k:=1; init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
writeln(+6-arl n-erelor de 3 !i"re este +,nr);
19
Metoda Backtracking Prof. Kabai Timea
writeln(+6-arl n-erelor !are se ter-ina in !i"ra 0 este +,nr0);
readln;
E!"
D. .entru a colora o 6art care reprezint * (udee se folosesc + culori. S se genereze toate modalitile n
care se pot colora (udeele ,i s se afi,eze ,i numrul lor.
program colorare; {Soluie: 360}
ses !rt;
t&pe sti#a=arra&'1..*( o" integer;
#ar st:sti#a;
a:arra&'1..4( o" string;
i,k,nr:integer;
as,e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()4 then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
"or i:=1 to k%1 do
i" not(st'k()>st'i() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=*);
end;
procedure tipar;
begin
"or i:=1 to k do write(a'st'i((:10); writeln;
nr:=nr$1;
end;
BEGI
,lr1!r;
nr:=0;
"or i:=1 to 4 do begin
write(+,loarea'+,i,+(=+); readln(a'i();
end;
k:=1; init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
11
Metoda Backtracking Prof. Kabai Timea
writeln(+6-arl posibilitatilor de !olorare= +,nr);
readln;
E!"
E. 0OMB1-2$1. S se determine toate submulimile cu b elemente aHb.
program combinari;
ses !rt;
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
i,k,a,b:integer;
as,e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()a then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
i" (k>=2) and not(st'k(>st'k%1() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=b);
end;
procedure tipar;
begin
"or i:=1 to k do write(st'i(:3);
writeln;
end;
BEGI
,lr1!r;
write(+a=+); readln(a);
write(+b=+); readln(b);
k:=1;
init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
1!
Metoda Backtracking Prof. Kabai Timea
readln;
E!"
G. 2intr$un numr de + cursuri opionale un elev trebuie s aleag 3. S se afi,eze toate posibilitile de
alegere precum ,i numrul lor.
program prog)*; {Soluie: 20}
ses !rt;
t&pe sti#a=arra&'1..3( o" integer;
#ar st:sti#a;
a:arra&'1..4( o" string;
k,i,n,nr:integer;
as,e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succ(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()4 then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
i" (k>=2) and not(a'st'k((>a'st'k%1(() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=3);
end;
procedure tipar;
begin
"or i:=1 to k do write(a'st'i((:10);
nr:=nr$1;
writeln;
end;
BEGI
,lr1!r;
"or i:=1 to 4 do begin
write(+a'+,i,+(=+);
readln(a'i();
end;
nr:=0; k:=1; init(k,st);
while k>0 do begin
repeat
s!!(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
1/
Metoda Backtracking Prof. Kabai Timea
end;
writeln(+6-arl posibilitatilor de alegere este +,nr);
readln;
E!"
F. P$O3U4UL 0A$/E%1A- A - MUL51M1. Se dau mulimile de mai (os ,i se cere produsul cartezian
al lor.
A
1
=01 ! ... &
1
1
A
!
=01 ! ... &
!
1
. . .
A
n
=01 ! ... &
n
1.
Exemplu:
A
1
=01 !1
A
!
=01 ! /1
A
/
=01 ! /1
A
1
I A
!
I A
/
=
0 (1 1 1# (1 1 !# (1 1 /#
(1 ! 1# (1 ! !# (1 ! /#
(1 / 1# (1 / !# (1 / /#
(! 1 1# (! 1 !# (! 1 /#
(! ! 1# (! ! !# (! ! /#
(! / 1# (! / !# (! / /#1.
.entru rezolvare se folosesc stiva st ,i un vector ' ce reine numerele k
)
, k
/
, """ , k
n
utiliz3nd metoda
bac&trac&ing u,or modificat din urmtoarele motive:
a. -rice element aflat pe nivelul k al stivei este valid motiv pentru care procedura valid nu face altceva
dec3t atribuie variabilei ev valoarea trueC
b. ?imita superioar pe nivelul k al stivei este dat de '(k)"
@odul de concepere a algoritmului rezult din cele ce urmeaz:
1 ! / 1
1 1 1 ! !
1 1 1 1 1 1
! / 1 ! /
! ! / / / /
1 1 1 1 1 1
. . .
program produs$carte0ian;
t&pe sti#a=arra&'1..20( o" integer;
ses !rt;
#ar st:sti#a;
i,n,k:integer;
as, e#:boolean;
a:arra&'1..100( o" integer;
procedure init(k:integer; var st:stiva);
1B
Metoda Backtracking Prof. Kabai Timea
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()a'k( then begin
st'k(:=st'k($1;
as:=tre;
end
else as:="alse
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
#ar i:integer;
begin
e#:=tre;
end;
function solutie(k:integer):boolean;
begin
i" k=n then soltie:=tre
else soltie:="alse;
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to n do write(st'i(,+ +);
writeln;
end;
BEGI
,lr1!r;
write(+6-arl de -lti-i= +); readln(n);
"or i:=1 to n do begin
write(+a'+,i,+(=+);
readln(a'i();
end;
k:=1;
init(k,st);
while (k>0) do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k)
ntil (not as) or (as and e#);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k, st);
end
else k:=k%1;
end;
readln;
E!"
1A
Metoda Backtracking Prof. Kabai Timea
19. 4UBMUL51M1. >ie '=(a
)
,a
/
,1a
n
., cu elemente de tipul integer. S se determine toate
submulimile mulimii A.
.entru a genera submulimile mulimii ' vom folosi vectorul st=(st
)
,st
/
,1,st
n
) ale crui componente
au numai valorile 2 sau ) astfel:
dac st
i
=) se afi,eaz a
i
dac st
i
=2 nu se afi,eaz a
i
%a trebui s generm toate ,irurile de dimensiune n ale cror elemente au numai valorile 2 ,iJsau ).
EXEMPLU. Submulimile mulimii '=(),/,31 sunt:
4ub"ui"i &ectorii care e corespund
3 (2,2,2)
(). (),2,2)
(/. (2,),2)
(3. (2,2,))
(),/. (),),2)
(),3. (),2,))
(/,3. (2,),))
(),/,3. (),),))
5rebuie s se determine elementele mulimii ((st
)
,st
/
,1,st
n
) 4 st
k
(2,)., k=),1,n."
program submult;
ses !rt;
t&pe sti#a=arra&'1..100( o" integer;
#ar st,a:sti#a;
k,i,n:integer;
as,e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=%1;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()1 then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
end;
function solutie(k:integer):boolean;
begin
1D
Metoda Backtracking Prof. Kabai Timea
soltie:=(k=n);
end;
procedure tipar;
begin
write(+{+);
"or i:=1 to k do
i" st'i(=1 then write(a'i(:2);
write(+ }+);
writeln;
end;
BEGI
,lr1!r;
write(+n=+); readln(n);
"or i:=1 to n do begin
write(+a'+,i,+(=+);
readln(a'i();
end;
k:=1;
init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
readln;
E!"
EXEMPU.
1E
Metoda Backtracking Prof. Kabai Timea
11. P$OBLEMA 0OLO$2$11 62$51LO$. >iind dat o 6art cu n ri se cer toate soluiile de colorare a
6rii utiliz3nd cel mult B culori. astfel nc3t dou ri cu frontier comun s fie colorate diferit. =ste
demonstrat faptul c sunt suficiente numai B culori pentru ca orice 6art s poat fi colorat.
.entru exemplificare vom considera urmtoarea 6art unde rile sunt numerotate cu cifrele cuprinse ntre
1 ,i A:
- soluie a acestei probleme este urmtoarea:
ara 1 $ culoarea 1C
ara ! $ culoarea !C
ara / $ culoarea 1C
ara B $ culoarea /C
ara A $ culoarea BC
2e exemplu dac avem culorile:
1. ro,u
!. galben
/. albastru
B. verde
Karta colorat arat astfel:
1G
1
! /
B
A
Metoda Backtracking Prof. Kabai Timea
Karta este furnizat programului cu a(utorul unei matrice A
nn
.

'

altfel 9
( cu nvecineaz se i dac 1
(# A(i
@atricea ' este simetric. .entru rezolvarea problemei se utilizeaz stiva st unde nivelul k al stivei
simbolizeaz ara k iar st5k6 culoarea ata,at rii &. Stiva are nlimea n ,i pe fiecare nivel ia valori ntre )
,i *.
program colorare$7arta;
t&pe sti#a=arra&'1..100( o" integer;
#ar st: sti#a;
i,/,n,k:integer;
as, e#:boolean;
a:arra&'1..20, 1..20( o" integer;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as: boolean; var st:stiva; k:integer);
begin
i" st'k()* then begin
st'k(:=st'k($1;
as:=tre
end
else as:="alse
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
#ar i:integer;
begin
e#:=tre;
"or i:=1 to k%1 do
i" (st'i(=st'k() and (a'i,k(=1) then e#:="alse
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=n)
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to n do writeln(+7ara= +, i, +; !loarea= +, st'i();
writeln(+%%%%%%%%%%%%%+);
end;
BEGI
write(+6-arl de tari= +); readln(n);
1F
Metoda Backtracking Prof. Kabai Timea
"or i:=1 to n do
"or /:=1 to i%1 do begin
write(+a'+,i,+,+,/,+(=+); readln(a'i,/();
a'/,i(:=a'i,/(
end;
k:=1; init(k, st);
while k>0 do begin
repeat
s!!esor(as, st, k);
i" as then #alid(e#, st, k);
ntil (not as) or (as and e#);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k, st);
end
else k:=k%1;
end;
readln;
E!"
1!. P$OBLEMA 0ELO$ - 3AME. >iind dat o tabl de ,a6 n#n se cer toate soluiile de aran(are a n dame
astfel nc3t s nu fie dou dame pe aceea,i linie coloan sau diagonal (damele s nu se atace reciproc#.
.entru rezolvare se vor folosi:
k ; variabil ntreag care reprezint inia pe care se a#ea7! a k8a da"!
st; vector cu componente ntregi cu proprietatea:
st
k
reprezint cooana pe care se a#a7! a k8a da"!
2eoarece tabla are n linii ,i n coloane k9:',),n; ,i st
k
9:',),n;
st9<st
'
,st
(
,),st
n
= unde st
k
>:',),n;
k>:',),n;
Ur"!toaree desene iustrea7! c?nd da"a k #i da"a i se af! pe aceea#i diagona!@
st
i
st
k
st
k
st
i
!9
&
i
&$i=st
&
$st
i
(trebuie ca damele s fie
a,ezate n colurile unui
ptrat cu latura &$i respectiv
st
&
$st
i
#
i
&
&$i=st
i
$st
&
(trebuie ca damele s fie
a,ezate n colurile unui ptrat
cu latura &$i respectiv st
i
$st
&
#
Metoda Backtracking Prof. Kabai Timea
5rebuie verificat c da"a k nu se af! pe aceea#i cooan! sau pe aceea#i diagona! cu da"a i unde
i=1"&$1 adic trebuie artat c:
st
k
Ast
i
#i k8iABst
k
8st
i
B pentru i9')k8'
program dame;
t&pe sti#a=arra&'1..20( o" integer;
#ar st:sti#a;
n,k:integer;
as, e#:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()n then begin
st'k(:=st'k($1;
as:=tre;
end
else as:="alse
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
#ar i:integer;
begin
e#:=tre;
"or i:=1 to k%1 do i" (st'k(=st'i() or (abs(st'k(%st'i()=abs(k%i)) then
e#:="alse;
end;
function solutie(k:integer):boolean;
begin
i" k=n then soltie:=tre else soltie:="alse;
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to n do write(st'i(,+ +);
writeln;
end;
BEGI
write(+n= +); readln(n);
k:=1;
init(k,st);
while (k>0) do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k)
ntil (not as) or (as and e#);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k, st);
end
else k:=k%1;
end;
!1
Metoda Backtracking Prof. Kabai Timea
readln;
E!.
EXEMPLE.

1/. P$OBLEMA 0OM148&O1A.O$ULU1. <n comis$voia(or trebuie s viziteze un numr n de ora,e. +niial
acesta se afl ntr$unul din ele notat cu ). 4omisvoia(orul dore,te s nu treac de dou ori prin acela,i ora, iar
la ntoarcere s revin n ora,ul ). 4unosc3nd legturile existente ntre ora,e se cere s se tipreasc toate
drumurile posibile pe care le poate efectua comis$voia(orul.
Exemplu: 'n figura urmtoare sunt simbolizare + ora,e precum ,i drumurile existente ntre ele.
4omis$voia(orul are urmtoarele posibiliti de parcurgere:
1!/BAD1
1!AB/D1
1D/BA!1
1DAB/!1
?egturile existente ntre ora,e sunt date de matricea A
nn
. =lementele matricei A pot fi 9 sau 1 (matricea este
binar#.

'

altfel 9
( ,i i ntre drum exist dac 1
(# A(i
Se observ c A(i (# = A(( i# oricare ar fi i ,i ( aparin3nd mulimii 01 ! ... n1 matricea este simetric.
.entru rezolvarea problemei folosim o stiv st. ?a baza stivei (nivelul 1# se ncarc numrul 1. .rezentm n
continuare modul de rezolvare a problemei.
!
de la ora,ul 1 la ora,ul ! exist drum deci se va urca n stivC
1
!!
/
1
A
B
!
D
Metoda Backtracking Prof. Kabai Timea
!
ora,ul ! se mai gse,te n stiv deci nu este acceptatC !
1
/
de la ora,ul ! la ora,ul / exist drumC prin ora,ul / nu s$a mai trecut deci
ora,ul / este acceptat
!
1
Algoritmul continu n acest mod p3n se a(unge din nou la nivelul 1 caz n care algoritmul se nc6eie.
<n succesor ntre ! ,i n aflat pe nivelul & al stivei este considerat valid dac sunt ndeplinite urmtoarele
condiii:
nu s$a mai trecut prin ora,ul simbolizat de succesor deci acesta nu se regse,te n stivC
exist drum ntre ora,ul aflat pe nivelul k8) ,i cel aflat pe nivelul kC
dac succesorul se gse,te pe nivelul n s existe drum de la el la ora,ul ).
program comis$voia&or;
t&pe sti#a=arra&'1..100( o" integer;
#ar st: sti#a;
i,/,n,k:integer;
as, e#:boolean;
a:arra&'1..20, 1..20( o" integer;
procedure init(k:integer; var st:stiva);
begin
st'k(:=1;
end;
procedure succesor(var as: boolean; var st:stiva; k:integer);
begin
i" st'k()n then begin
st'k(:=st'k($1;
as:=tre
end
else as:="alse
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
#ar i:integer;
begin
e#:=tre;
i" a'st'k%1(, st'k((=0 then e#:="alse
else
"or i:=1 to k%1 do
i" st'i(=st'k( then e#:="alse;
i" (k=n) and (a'1, st'k((=0) then e#:="alse
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=n)
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to n do writeln(+6odl= +, st'i();
writeln(+%%%%%%%%%%+);
end;
!/
Metoda Backtracking Prof. Kabai Timea
BEGI
write(+6-arl de nodri= +); readln(n);
"or i:=1 to n do
"or /:=1 to i%1 do begin
write(+a'+,i,+,+,/,+(=+); readln(a'i,/();
a'/,i(:=a'i,/(
end;
st'1(:=1; k:=2; init(k, st);
while k>1 do begin
repeat
s!!esor(as, st, k);
i" as then #alid(e#, st, k);
ntil (not as) or (as and e#);
i" as then
i" soltie(k) then tipar
else begin
k:=k$1;
init(k, st);
end
else k:=k%1;
end;
readln;
E!"
1B. P$OBLEMA PA$A-/E%ELO$. S se genereze toate ,irurile de n paranteze rotunde nc6ise.
E9E:;<=. .entru n=* exist dou succesiuni posibile (()) ,i () ()
.roblema are soluie numai dac n este par.
4ele dou tipuri de paranteze se codific astfel: ' pentru (, ,i ( pentru #. Lin3nd cont de ce s$a spus mai
sus soluiilor prezentate le corespund codificrile: <',',(,(= #i <',(,',(=.
%a trebui s se genereze toi vectorii st9<st
'
,st
(
,),st
n
=, unde st
k
>:',(;, k>:',),n; crora le corespund
succesiuni corecte de paranteze.
st
)
=) ,i st
n
=/
?a pasul k trebuie verificat c ntre numrul parantezelor desc6ise nrMpd ,i numrul parantezelor nc6ise nrMpi
trebuie s existe relaiile:
nr$pd>nr$pi ?i nr$pd@5nA/6
program parante0e;
ses !rt;
t&pe sti#a=arra&'1..100( o" integer;
#ar st:sti#a;
k,n:integer;
e#,as:boolean;
nr8pd,nr8pi:integer;
procedure init(k:integer; var st:stiva);
begin
!B
Metoda Backtracking Prof. Kabai Timea
st'k(:=0;
end;
pro!edre s!!esor(#ar as:boolean; #ar st:sti#a; k:integer);
begin
i" st'k()2 then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
#ar i:integer;
begin
nr8pd:=0; nr8pi:=0;
"or i:=1 to k do
i" st'i(=1 then nr8pd:=nr8pd$1
else nr8pi:=nr8pi$1;
e#:=(nr8pd>=nr8pi) and (nr8pd)=n di# 2);
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=n);
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to k do
i" st'i(=1 then write(+(+)
else write(+)+);
writeln;
end;
BEGI
,lr1!r;
write(+9ati n-arl parante:elor n=+); readln(n);
i" n -od 2)>0 then writeln(+;roble-a n are soltie +)
else begin
st'1(:=1;
k:=2;
init(k,st);
while k>1 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
i" soltie(k) then begin
i" nr8pd=nr8pi then tipar
end
else begin
!A
Metoda Backtracking Prof. Kabai Timea
k:=k$1;
init(k,st);

end
else k:=k%1;
end;
end;
readln;
E!"
1A. P$OBLEMA PL2511 U-E1 4UME 4 U/1L1%C-3 M /1PU$1 3E MO-E3E. Se dau suma s ,i m
tipuri de monede av3nd valorile de a
)
, a
/
,1a
m
lei. Se cer toate modalitile de plat a sumei s utiliz3nd aceste
monede.
%a trebui s se genereze toi vectorii de forma S5=(st
1
st
!
"st
m
# care verific relaia:
st
1
<a
1
$st
2
<a
2
$=$st
-
<a
-
=1
2in aceast relaie se poate vedea c:
st
1
poate lua valori ntre 9 ,i
1
]
1

1
1
a
S
n
st
!
poate lua valori ntre 9 ,i
1
]
1

!
!
a
S
n
"""""""""""""""".
st
&
poate lua valori ntre 9 ,i
1
]
1

k
k
a
S
n
"""""""""""""""".
st
m
poate lua valori ntre 9 ,i
1
]
1

m
m
a
S
n
'n concluzie va trebui s se determine elementele mulimii
{(st
1
,st
2
,=,st
-
) > st
k
?{0,=,n
k
}, nde k=1=-, st
1
<a
1
$st
2
<a
2
$=$st
-
<a
-
=1}
EXEMPLU. 1=3, -=2, a'1(=1, a'2(=2, programul va genera urmtoarele soluii:
(1,1) !orespnde )<a
1
$)<a
2
=1<1$1<2=3
(3,0) !orespnde 3<a
1
$2<a
2
=3<1$0<2=3
program plati;
ses !rt;
t&pe sti#a=arra&'1..100( o" integer;
!D
Metoda Backtracking Prof. Kabai Timea
#ar st,n,a:sti#a;
i,k,-,s:integer;
e#,as:boolean;
procedure init(k:integer; var st:stiva);
begin
st'k(:=%1;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
i" st'k()n'k( then begin
as:=tre;
st'k(:=st'k($1;
end
else as:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
begin
e#:=tre;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=-);
end;
procedure tipar;
#ar s1:integer;
begin
s1:=0;
"or i:=1 to k do s1:=s1$st'i(@a'i(;
i" s=s1 then begin
"or i:=1 to k%1 do write(st'i(,+@+,a'i(,+$+);
write(st'k(,+@+,a'k(,+=+,s);
writeln;
end;
end;
BEGI
,lr1!r;
write(+9ati #aloarea s-ei s=+); readln(s);
write(+9ati n-arl -onedelor -=+); readln(-);
writeln(+9ati #alorile !elor +,-,+ -onede +);
"or i:=1 to - do begin
write(+a'+,i,+(=+); readln(a'i();
n'i(:=trn!(1Aa'i();
end;
k:=1;
init(k,st);
while k>0 do begin
repeat
s!!esor(as,st,k);
i" as then #alid(e#,st,k);
ntil (as and e#) or (not as);
i" as then
!E
Metoda Backtracking Prof. Kabai Timea
i" soltie(k) then tipar
else begin
k:=k$1;
init(k,st);
end
else k:=k%1;
end;
readln;
E!"
Backtracking recursiv dup! scDe"!
.rezentm n continuare algoritmul bac&trac&ing recursiv. .rocedurile ,i funciile folosite sunt
asemntoare cu cele de la bac&trac&ing clasic cu dou mici excepii:
succesor nu mai este procedur ci funcie boolean (dispare variabila as#C
rutina bac&trac&ing se transform n procedur care se apeleaz prin bac&(1#.
.rincipiul de funcionare al procedurii bac& corespunztor unui nivel & este urmtorul:
n situaia n care avem o soluie o tiprim ,i revenim pe nivelul anteriorC
n caz contrar se iniializeaz nivelul ,i se caut un succesorC
c3nd am gsit unul verificm dac este validC procedura se autoapeleaz pentru &*1 n caz contrar
urm3nd a se continua cutarea succesoruluiC
dac nu avem succesor se trece pe nivelul inferior (&$1# prin ie,irea din procedura bac&.
pro!edre ba!k(k:integer)
begin
i" soltie(k) then tipar
else begin
init(k, st);
while s!!esor(st, k) do begin
#alid(e#, st, k);
i" e# then ba!k(k$1)
end
end
end;
!G
Metoda Backtracking Prof. Kabai Timea
%om prezenta n continuare programul bac&trac&ing recursiv pentru generarea permutrilor
{ progra-l de ba!ktra!king re!rsi# pentr generarea per-tarilor }
program permut$recursiv;
t&pe sti#a=arra&'1..5( o" integer;
#ar st: sti#a;
e#: boolean;
n,k: integer;
procedure init(k:integer; var v:stiva);
begin
st'k(:=0;
end;
function succesor(var st:stiva; k:integer): boolean;
begin
i" st'k()n then begin
st'k(:=st'k($1;
s!!esor:=tre;
end
else s!!esor:="alse
end;
procedure valid (var ev: boolean; st:stiva; k:integer);
#ar i:integer;
begin
e#:=tre;
"or i:=1 to k%1 do i" st'i(=st'k( then e#:="alse
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=n$1)
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to n do write(st'i();
writeln;
end;
pro!edre ba!k(k:integer);
begin
i" soltie(k) then tipar
else begin
init(k, st);
!F
Metoda Backtracking Prof. Kabai Timea
while s!!esor(st, k) do begin
#alid(e#, st, k);
i" e# then ba!k(k$1);
end
end
end;
BEGI
write(+n=+); readln(n);
ba!k(1);
readln;
E!.
program combinari$recursiv;
t&pe sti#a=arra& '1..10( o" integer;
#ar st:sti#a;
e#:boolean;
n,k,p:integer;
procedure init(k:integer;var st:stiva);
begin
st'k(:=0;
end;
function succesor(var st:stiva;k:integer):boolean;
begin
i" st'k()n then begin
st'k(:=st'k($1;
s!!esor:=tre;
end
else s!!esor:="alse;
end;
procedure valid(var ev:boolean; st:stiva; k:integer);
#ar i:integer;
begin
e#:=tre;
i" (k>=2) and not (st'k(>st'k%1() then e#:="alse;
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to p do write (st'i(:3);
writeln;
end;
procedure back(k:integer);
begin
i" k=p$1 then tipar
/9
Metoda Backtracking Prof. Kabai Timea
else begin
init(k,st);
while s!!esor(st,k) do begin
#alid(e#,st,k);
i" e# then ba!k(k$1);
end;
end;
end;
BEGI
write(+n= +);readln(n);
write(+p= +);readln(p);
ba!k(1);
readln;
E!"
program aran&amente$recursiv;
t&pe sti#a=arra& '1..100( o" integer;
#ar st:sti#a;
e#:boolean;
n,p,k:integer;
procedure init(k:integer; var st:stiva);
begin
st'k(:=0;
end;
function succesor(var st:stiva;k:integer):boolean;
begin
i" st'k()n then begin
st'k(:=st'k($1;
s!!esor:=tre;
end
else s!!esor:="alse;
end;
procedure valid(var ev:boolean; var st:stiva;k:integer);
#ar i:integer;
begin
e#:=tre;
"or i:=1 to k%1 do
i" not(st'k()>st'i() then e#:="alse;
end;
function solutie(k:integer):boolean;
begin
soltie:=(k=p$1);
end;
procedure tipar;
#ar i:integer;
begin
"or i:=1 to p do write (st'i(:3);
writeln;
end;
procedure back(k:integer);
/1
Metoda Backtracking Prof. Kabai Timea
begin
i" soltie(k) then tipar
else begin
init(k,st);
while s!!esor(st,k) do begin
#alid(e#,st,k);
i" e# then ba!k(k$1);
end;
end;
end;
BEGI
write(+n= +); readln(n);
write(+p= +); readln(p);
ba!k(1);
readln;
E!.
/!

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