Itemii de backtracking de la BAC Informatică au aproape mereu aceeași formă: enunțul descrie o generare, îți dă primele soluții ca exemplu și te întreabă care este soluția de pe o anumită poziție, soluția de după o soluție dată sau câte soluții au o anumită proprietate. Nu trebuie să scrii cod. Trebuie însă să răspunzi repede și corect, iar metoda „le scriu pe toate până ajung acolo” e lentă și plină de ocazii de greșeală. Mai jos ai tehnica pe care o poți aplica la orice astfel de item.

Pasul 0: traduce enunțul în numere

Enunțurile vorbesc despre flori, culori, orașe sau cifre. Primul lucru pe care îl faci este să numerotezi elementele în ordinea în care apar în enunț (1, 2, 3, …) și să stabilești tipul generării:

Apoi verifici ipoteza pe soluțiile date ca exemplu. Dacă primele trei soluții se potrivesc cu ce ar produce generarea ta, ai înțeles corect enunțul.

Tehnica „soluției următoare”

Backtracking-ul se comportă ca un contor: modifică întotdeauna cea mai din dreapta poziție care mai poate fi crescută, iar tot ce urmează după ea primește cele mai mici valori valide. De aici rezultă algoritmul de lucru de mână:

  1. Pornești de la ultima poziție a soluției date.
  2. Te întrebi: există o valoare mai mare decât cea actuală, care să fie validă ținând cont de elementele din stânga?
  3. Dacă nu, treci la poziția din stânga și repeți întrebarea.
  4. La prima poziție unde răspunsul e „da”, pui cea mai mică valoare mai mare care e validă.
  5. Completezi pozițiile din dreapta cu cele mai mici valori valide, în ordine.

Exemplul 1: permutări

Se generează în ordine lexicografică permutările mulțimii {1, 2, 3, 4}. Care este permutarea generată imediat după 2 4 3 1?

Răspuns: 3 1 2 4.

Exemplul 2: numere cu cifre distincte

Se generează, în ordine crescătoare, numerele de 3 cifre distincte formate cu cifre din mulțimea {1, 3, 5, 7}: 135, 137, 153, 157, 173, … Care este numărul generat după 375?

Aceasta este o generare de aranjamente. Ultima cifră, 5, nu poate deveni 7, pentru că 7 e deja folosit. Cifra din mijloc, 7, nu poate crește. Prima cifră, 3, devine 5, iar restul se completează cu cele mai mici cifre disponibile: 1 și 3. Răspuns: 513.

La BAC: după ce găsești răspunsul, verifică-l invers: există vreo soluție validă între cea dată și cea găsită? Dacă ai sărit peste o valoare posibilă pe o poziție din dreapta, testul ăsta te prinde.

Tehnica numărării pe prefixe

Când ți se cere a k-a soluție (de exemplu „a opta”), nu le scrii pe toate. Numeri câte soluții încep cu un anumit prefix și sari peste grupuri întregi.

Exemplul 3: a opta combinare

Se generează submulțimile cu 3 elemente ale mulțimii {1, 2, 3, 4, 5, 6}, cu elementele în ordine crescătoare: 123, 124, 125, … Care este a opta soluție?

Răspuns: 1 4 5.

Exemplul 4: poziția unei soluții

Întrebarea inversă: a câta permutare a mulțimii {1, 2, 3, 4} este 3 1 2 4? Permutările care încep cu 1 sunt 3! = 6, cele care încep cu 2 sunt tot 6, deci primele 12 soluții încep cu 1 sau 2. 3 1 2 4 este cea mai mică permutare care începe cu 3, deci este a 13-a.

Exemplul 5: un enunț cu obiecte

Un enunț tipic: „Utilizând metoda backtracking, se generează toate buchetele formate din câte 3 flori distincte din mulțimea {lalea, trandafir, crin, mac, frezie}. Primele trei soluții generate sunt: (lalea, trandafir, crin), (lalea, trandafir, mac), (lalea, trandafir, frezie). Care este a cincea soluție?”

Numerotezi: lalea = 1, trandafir = 2, crin = 3, mac = 4, frezie = 5. Exemplele devin 123, 124, 125, adică ordinea nu contează, iar soluțiile sunt combinări de 5 luate câte 3. Continuarea este 134, apoi 135, adică (lalea, crin, frezie). Dacă ai fi ordonat florile alfabetic, ai fi obținut un răspuns greșit: ordinea vine din enunț, nu din alfabet.

Soluția anterioară

Uneori ți se cere soluția generată înainte de una dată. Aplici aceeași idee în oglindă: cauți cea mai din dreapta poziție care poate fi micșorată la o valoare validă, iar pozițiile din dreapta ei primesc cele mai mari valori valide. De exemplu, la combinările de 5 luate câte 3, înainte de 145 vine 135: poziția a doua scade de la 4 la 3, iar ultima ia valoarea maximă, 5. Verificare: lista este 123, 124, 125, 134, 135, 145, deci răspunsul e corect.

Itemii cu „câte soluții”

Dacă întrebarea este câte soluții sunt în total sau câte au o proprietate, folosește formulele: n! pentru permutări, n!/(n−p)! pentru aranjamente, n!/(p!(n−p)!) pentru combinări. Pentru o proprietate simplă (de exemplu „câte permutări ale lui {1,…,5} încep cu 5”), fixezi ce e impus și numeri ce rămâne liber: aici 4! = 24.

Greșeli care costă puncte

De reținut