Documente Academic
Documente Profesional
Documente Cultură
D rago G oia
Prezentare
met
ode backtra
cking
g
n
i
k
c
a
r
t
k
c
a
b
p
r
o
C
Probleme cu backtracking
Metode backtracking
Prezentare metod general
Implementare it
erativ
v
i
s
r
u
c
e
r
e
r
a
t
n
e
Implem
In plan
Metoda
general
Implementare recursiv
Implementarea recursiv a
algoritmului furnizat de metoda
backtracking, este mai natural i deci
mai uoar.
Segmentul de stiv pus la dispoziie
prin apelul funciei este gestionat n
mod automat de sistem.
Revenirea la pasul precedent se
realizeaz n mod natural prin
nchiderea nivelului de stiv.
Continuare
{int i;
for (i=1; i<=nr_elemente_Sk; i++) //parcurge elementele
mulimii Sk
{ v[k]=i; //selecteaz un element din mulime
if (validare(k)==1) //valideaz condiiile de continuare ale
problemei
{ if (solutie(k)==1) //verific dac s-a obinut o soluie
afisare(k); //afieaz soluia
else
BK(k+1); //reapeleaz functia pentru poziia k+1
}
} //dac nu mai exist nici un element neselectat n
mulimea Sk,
} //se nchide nivelul de stiv i astfel se revine pe poziia
k-1 a
//vectorului
Implementare iterativa
1. Fiecare nivel al stivei trebuie iniializat cu o valoare aflat
naintea tuturor valorilor posibile din mulimea soluiilor. Aceast
afiare se face cu funcia init().
2. Gsirea urmtorului element netestat de pe un nivel k al stivei
St se face cu funcia
succesor (), altfel 1, dac exist valoare netestat pentru nivelul k
. Dac exist valoare netestat
(succesor), atunci se va alege o nou valoare (netestat) pentru
nivelul k.
3. Odat ales un element testarea condiiilor de validare se face cu
funcia
valid() 0, altfel 1, dac valoarea de p enivelul k ndeplinet e
condiondide validare
4. Testul dac s-a ajuns sau nu la o soluie final se face cu funcia
soluie ( ) 0, altfel 1, dac s- a completat ultimul nivel din stiv
5. Soluia se tiprete cu funcia tipar()
void bkt()
{k=1; //se completeaz stiva ncepnd cu primul nivel
init (); //se iniializeaz primul nivel al stivei
while (k>0)
{do{AS= succesor(); }while (AS && valid()==0);
//se caut succesor pe nivelul k atta timp ct exist
succesor care nu este valid
if (AS) //exist succesor
if solutie() //dac s-a completat stiva
tipar() //se tiprete soluia
else //stiva nu s-a completat
{ k++; // se trece pe nivelul urmtor
init(); // se iniializeaz noul nivel }
else k--; // nu exist succesor pentru nivelul k,
deci se coboar un nivel n stiv }}
Paii
Probleme generale
Info plus
Backtracking recursiv
back (k)
pentru fiecare valoare i din
multimea Sk execut
xki
dac X respect condiiile interne
atunci
dac X este solutie atunci
afiseaz X
altfel
apeleaz back(k+1)
sfdac
sfdac
sfpentru
Algoritm
Recursiv
Permutri
S se genereze toate permutrile primelor n numere
naturale.
Vom genera pe rnd soluiile problemei n vectorul
v=(v1,v2,v3,...,vn), unde vkSk.
S facem urmtoarele observaii:
1. Pentru aceast problem toate mulimile Sk sunt
identice, Sk={1,2,3,....,n}.
La pasul k selectm un element din mulimea Sk.
2. ntruct n cadrul unei permutri elementele nu au
voie s se repete
Recursiv
Cu backtracking
Fr backtracking
Recursiv
Timpii de executie
Timpii de executie
Permutari cu backtracking
Recursiv
Probleme generale
generarea permutrilor unei mulimi
generarea aranjamentelor unei mulimi
generarea submulimilor unei mulimi
generarea submulimilor cu m elemente ale
unei mulimi (combinri)
generarea produsului cartezian a n mulimi
generarea tuturor secvenelor de n (par)
paranteze care se nchid corect.
colorarea rilor de pe o hart astfel nct
oricare dou ri vecine s aib culori diferite
aranjarea a n regine pe o tabl de ah de
dimensiune n fr ca ele s se atace.
01
Teorie
03
02
Exemplu Rezolvare
Backtracking n plan
Fie urmatoare problema: un soricel se gaseste intr-un
labirint de forma dreptunghiulara cu m linii si n
coloane. Peretii sunt marcati cu 1 si culoarele cu 0. Se
cunosc coordonatele initiale ale soricelului: Li, Ci. Sa
se determine toate posibilitatile pe care le are soricelul
pentru a iesi din labirint. Soricelul poate avansa pe 4
directii cate o celula (sus, dreapta , jos, stanga).
O astfel de problema presupune o abordare
Backtracking in plan. Traseul soricelului va fi retinut
de un vector cu doua campuri: coordonatele x si y. Vom
defini un tip struct:
struct pozitie
{int x,y;};
d[k].x=x;
d[k].y=y;
Continuare
{if(a[x][y]==0)
{k++;
a[x][y]=2;
d[k].x=x;
if((x<1)||(x>m)||(y<1)||(y>n))
d[k].y=y;
if((x<1)||(x>m)||(y<1)||(y>n)) tipar(k);
else {ies(x-1,y);
ies(x,y+1);
ies(x+1,y);
ies(x-1,y);
ies(x,y-1); }
ies(x,y+1);
ies(x+1,y);
ies(x,y-1);
tipar(k);
a[x][y]=0;
k--;
solutia 2
Fie urmatorul labirint: m=6 n=10 Li=4, Ci=3
1111011111
1111011111
1111011111
1100000000
1111111011
1111111011
1111011111
1111011111
1111011111
1122222222
1111111011
1111111011
Exemplu
solutia 3
(4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (5,8) (6,8) (7,8)
1111011111
1111011111
1111011111
1122222200
1111111211
1111111211
for(int i=1;i<=k;i++)
Sursa
cout<<"("<<d[i].x<<','<<d[i].y<<") ";
#include<fstream>
afis_mat();
#include<conio.h>
getch();
struct pozitie
{int x,y;};
cout<<endl;}
void ies(int x,int y) //genereaza drumul
{if(a[x][y]==0)
int a[20][20];//labirintul
{k++;
int k,n,m,Li,Ci,nr_sol;
a[x][y]=2;
pozitie d[50];
d[k].x=x;
d[k].y=y;
{cout<<endl;
if((x<1)||(x>m)||(y<1)||(y>n))
for(int i=1;i<=m;i++)
{for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
tipar(k);
else{ies(x-1,y);
ies(x,y+1);
ies(x+1,y);
ies(x,y-1);}
a[x][y]=0; //la revenire din apel
demarchez celula pentru a o putea accesa
si in cadrul altei prelucrari
k--;//eliberez componenta din vectorul
drumului}}
void citire()
{ fstream f;
f.open("labir.txt",ios::in);
if(f)
cout<<"ok";
else
cout<<"eroare la deschidere";
f>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
f>>a[i][j];
f>>Li>>Ci; //coordonatele punctului in
care se afla soricelul}
Int main( ){
int main()
{clrscr();
k=0;
citire();
ies(Li,Ci);
afis_mat();
getch(); }
Subprograme folosite
Metoda backtracking va folosi o serie
de proceduri i funcii care vor fi
folosite totdeauna cu acelai nume i
aceiai parametri:
procedure init(k, st);
procedure succesor(k, st, as);
procedure validare(k, st, ev);
function solutie(k): boolean;
procedure tipar;
PROBLEME CU
BACKTRACKING
01 PROBLEMA CALULUI
02 - PERMUTRI
03 - ARANJAMENTE
04 - LABIRINT
05 PROBLEMA REGINEI
06 - COMBINRI
07 PRODUS CARTEZIAN
08 - PARTIII