Metoda backtracking este o tehnică fundamentală de căutare sistematică în spațiul soluțiilor, utilizată pentru a genera toate configurațiile posibile care satisfac anumite condiții. Ea se bazează pe construirea progresivă a soluțiilor, pas cu pas, și pe revenirea (backtracking) atunci când o ramură nu mai poate duce la o soluție validă. În contextul combinatoric, backtracking este perfect pentru generarea permutărilor, aranjamentelor și combinarilor.
Generarea permutărilor presupune aranjarea tuturor elementelor unei mulțimi într-o anumită ordine. De exemplu, pentru mulțimea {1,2,3}, permutările sunt: 123, 132, 213, 231, 312, 321. Algoritmul backtracking construiește un vector soluție în care fiecare poziție (de la 1 la n) primește un element diferit, iar la fiecare pas verificăm dacă elementul ales a mai fost folosit (prin vector de prezență).
Când ajungem la poziția n+1, soluția este completă și o afișăm, apoi reluăm căutarea pentru alte variante.
Generarea aranjamentelor (de n luate câte k) este similară, dar se oprește după k elemente (k ≤ n). Se generează toate submulțimile ordonate de k elemente din cele n. De exemplu, pentru n=3, k=2, aranjamentele sunt: 12, 13, 21, 23, 31, 32. Algoritmul construiește un vector de k elemente, cu aceleași restricții de unicitate, și afișează soluția când s-au completat k poziții.
Generarea combinarilor (de n luate câte k) generează submulțimi neordonate, adică nu contează ordinea elementelor. De exemplu, pentru n=3, k=2, combinarile sunt: 12, 13, 23. Pentru a evita generarea permutărilor aceleiași submulțimi, impunem ca elementele din vectorul soluție să fie strict crescătoare.
Astfel, la pasul i, alegem o valoare mai mare decât cea de pe poziția anterioară, iar intervalul de valori permise este [1, n] dar cu această restricție.
Algoritmul general backtracking are următoarea structură: se definește o funcție recursivă care primește ca parametru indicele curent (de regulă, pas). În cadrul funcției, se parcurg toate valorile posibile pentru poziția respectivă. Pentru fiecare valoare, se verifică dacă aceasta respectă condițiile de continuare (de exemplu, dacă nu a mai fost folosită, sau dacă este mai mare decât precedentul).
Dacă da, se adaugă valoarea în vector, se marchează (dacă e cazul) și se apelează recursiv pentru pasul următor. După revenirea din apel, se anulează marcarea (backtrack). Când s-a atins pasul final (n+1 pentru permutări, k+1 pentru aranjamente/combinații), se procesează soluția.
Complexitatea este factorială sau combinatorică, fiind utilizată în probleme de optimizare, generare sau căutare exhaustivă. Elevii trebuie să înțeleagă cum se implementează condițiile de validare (de exemplu, vector de frecvență pentru unicitate, sau ordine crescătoare pentru combinări). Exemplele clasice din manualele de BAC includ generarea permutărilor, a aranjamentelor și a combinarilor, dar și probleme precum 'reginele' sau 'parantezele'.
În concluzie, metoda backtracking este esențială pentru rezolvarea problemelor de tip 'generare' și apare frecvent la evaluări și concursuri.
Concepte cheie: Backtracking: construire treptată a soluțiilor cu revenire la eșec, Generarea permutărilor: n! soluții, vector de frecvență pentru unicitate, Generarea aranjamentelor: n!/(n-k)! soluții, similar permutărilor dar cu oprire la k elemente, Generarea combinarilor: C(n,k) soluții, restricție de ordine crescătoare, Condiții de validare specifice fiecărui tip de generare
Vrei exerciții pe lecția asta + AI care te ajută pas cu pas?
Cont gratuit — 20 întrebări AI/zi, exerciții nelimitate.