Sunteți pe pagina 1din 3

Backtracking

Metoda backtracking poate fi aplicată în rezolvarea problemelor care respectă


următoarele condiții:
 soluția poate fi reprezentată printr-un tablou x[]=(x[1], x[2], ..., x[n]),
fiecare element x[i] aparținând unei mulțimi cunoscute Ai;
 fiecare mulțime Ai este finită, iar elementele ei se află într-o relație de
ordine precizată – de multe ori cele n mulțimi sunt identice;
 se cer toate soluțiile problemei sau se cere o anumită soluție care nu
poate fi determinată într-un alt mod (de regulă mai rapid).
Algoritmul de tip backtracking construiește vectorul x[] (numit vector soluție)
astfel:
Fiecare pas k, începând (de regulă) de la pasul 1, se prelucrează elementul
curent x[k] al vectorului soluție:
 x[k] primește pe rând valori din mulțimea corespunzătoare Ak;
 la fiecare pas se verifică dacă configurația curentă a vectorului soluție
poate duce la o soluție finală – dacă valoarea lui x[k] este corectă în
raport cu x[1], x[2], … x[k-1]:
 dacă valoarea nu este corectă, elementul curent X[k] primește
următoarea valoare din Ak sau revenim la elementul anterior x[k-1],
dacă X[k] a primit toate valorile din Ak – pas înapoi;
 dacă valoarea lui x[k] este corectă (avem o soluție parțială), se
verifică existența unei soluții finale a problemei:
 dacă configurația curentă a vectorului soluție x reprezintă
soluție finală (de regulă) o afișăm;
 dacă nu am identificat o soluție finală trecem la următorul
element, x[k+1], și reluăm procesul pentru acest element – pas înainte.
Pe măsură ce se construiește, vectorul soluție x[] reprezintă o soluție parțială a
problemei. Când vectorul soluție este complet construit, avem o soluție finală a
problemei.
Exemplu: Problema damelor
Fiind dată o tablă de şah, de dimensiune n, xn, se cer toate soluţiile de
aranjare a n dame, astfel încât să nu se afle două dame pe aceeaşi linie,
coloană
sau diagonală (dame să nu se atace reciproc).

#include <iostream.h>
#include <math.h>
int n,v[100],sol;
void afisare()
{int i,j,x;
sol++; cout<<"\n Solutia: "<<sol<<'\n';
for (i=1;i<=n;i++)
{for (j=1;j<=n;j++)
if (v[i]==j) cout<<"D ";
else cout<<"_ ";
cout<<'\n';
}
}
int valid(int k)
{int i;
for (i=1;i<=k-1;i++)
if ((v[i]==v[k])||(abs(v[k]-v[i])==(k-i)))
return 0;
return 1;}
int solutie(int k)
{if (k==n)
return 1;
return 0;}
void BK(int k)
{int i;
for (i=1;i<=n;i++)
{v[k]=i;
if (valid(k)==1)
{if (solutie(k)==1)
afisare();
else
BK(k+1);
}
}
}
void main()
{cout<<"n= ";cin>>n;
BK(1);
}

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