Pe scurt
Varianta iterativă păstrează explicit nivelul curent și candidații încercați la fiecare nivel. Când nu mai există candidat valid, scade nivelul și încearcă următoarea alegere acolo. Pentru perechi din fără repetiție, nivelul 1 alege 1, nivelul 2 alege 2 și afișează 12; apoi revine, alege 2 la nivelul 1 și 1 la nivelul 2, afișând 21.
În detaliu
În varianta iterativă a backtracking-ului, nivelul curent și soluția parțială sunt variabile explicite, iar un singur ciclu înlocuiește apelurile recursive. Valoarea înseamnă că pe nivelul nu a fost încă încercat niciun candidat. Cât timp : dacă pe nivelul mai există candidați netestați (), se trece la următorul, , și se verifică dacă soluția parțială este validă; dacă este validă și , se afișează soluția, iar dacă , se avansează la nivelul cu . Dacă pe nivelul candidații s-au epuizat, se revine la nivelul , adică scade cu 1. Condiția de validitate este separată de mecanismul de avans și revenire, ca să poată fi schimbată de la o problemă la alta.
Exemplul 1 — permutările lui .
#include <iostream>
using namespace std;
int n = 3, x[10];
bool valid(int k) {
for (int i = 1; i < k; ++i)
if (x[i] == x[k]) return false;
return true;
}
int main() {
int k = 1;
x[1] = 0;
while (k > 0) {
if (x[k] < n) {
++x[k];
if (valid(k)) {
if (k == n) {
for (int i = 1; i <= n; ++i) cout << x[i];
cout << " ";
} else {
++k;
x[k] = 0;
}
}
} else
--k;
}
return 0;
}
Programul afișează 123 132 213 231 312 321 . Urmărirea începutului: , devine 1 și este valid, deci cu ; devine 1, dar , deci nu este valid și se încearcă următorul candidat; este valid, deci ; ia valorile 1 și 2, ambele invalide, apoi 3, valid: se afișează 123. Cum , nu mai există candidați pe nivelul 3 și scade la 2; acolo ia valoarea 3, valid, iar nivelul 3 produce 132. În total, este incrementat de 30 de ori până la epuizarea spațiului pentru .
Exemplul 2 — generarea în ordine. Fiindcă pe fiecare nivel candidații cresc de la 1, soluțiile apar în ordine lexicografică crescătoare. Pentru primele patru permutări sunt 1234, 1243, 1324 și 1342. Resetarea la intrarea pe un nivel este obligatorie: dacă ar lipsi, nivelul ar relua de la valoarea rămasă de la ultima vizită și ar rata candidați.
Cum se citește scheletul. Variabila k joacă rolul vârfului unei stive: ++k este intrarea într-un nivel nou, iar --k este ieșirea din nivelul epuizat. Ciclul se termină când ajunge la 0, adică atunci când nivelul 1 și-a epuizat candidații. Fiecare soluție completă se obține dintr-un drum de lungime de la rădăcina arborelui de căutare.
Exemplul 3 — alt tip de problemă cu același schelet. Pentru produsul cartezian, în care orice valoare este permisă pe orice nivel, funcția valid întoarce mereu true; scheletul rămâne neschimbat. Pentru aranjamente de elemente, condiția de afișare devine (cu lungimea cerută), nu .
Exemplul 4 — aranjamente de 3 luate câte 2. Se pornește de la scheletul permutărilor și se schimbă un singur test: soluția este completă la nivelul , deci if (k == p) înlocuiește if (k == n). Pentru și se afișează 12 13 21 23 31 32, adică soluții. Pentru , valoarea este respinsă (egală cu ), iar și dau 12 și 13; apoi , nivelul 2 este epuizat, scade la 1 și devine 2.
Pentru admitere
Urmărește perechea și motivul fiecărei reveniri. Dacă după epuizarea candidaților nu resetezi poziția, la o nouă intrare pe nivel căutarea ar porni dintr-o valoare greșită. Numărul soluțiilor depinde de restricții, nu de faptul că implementarea este iterativă. Testul x[k] < n decide dacă mai există candidați; un test x[k] <= n ar produce valoarea , în afara domeniului. Când subiectul cere a -a soluție, numără soluțiile afișate, nu avansările. Dacă pe un nivel candidații sunt încercați descrescător (de la la 1), soluțiile apar în ordine lexicografică descrescătoare, iar prima este 4321 pentru . Dacă funcția de validitate lipsește, algoritmul generează toate șirurile din , adică șiruri: 27 pentru în loc de 6. Pentru există o singură soluție, 1: nivelul 1 alege 1, soluția se afișează, apoi epuizează nivelul și devine 0.
Exemplu în formatul examenului. Un algoritm iterativ de tip backtracking generează în ordine crescătoare lexicografică toate permutările mulțimii . Care este a patra permutare generată?
- a)
1324 - b)
1342 - c)
1423 - d)
2134
Răspunsul corect este b). Permutările apar în ordinea 1234, 1243, 1324, 1342, 1423, 1432, 2134 și așa mai departe. Prima valoare este 1 pentru primele șase permutări, iar în cadrul lor a doua valoare crește de la 2 la 4. A patra permutare este deci 1342. Varianta a) este a treia, varianta c) este a cincea, iar varianta d) este a șaptea.
Greșeli frecvente
- Greșit: la revenirea pe un nivel, candidatul rămâne cel de la ultima vizită.Corect: la intrarea pe un nivel valoarea se resetează la 0, ca să se încerce toți candidații.
- Greșit: varianta iterativă nu are nevoie de verificarea validității.Corect: condiția de validitate este aceeași ca în varianta recursivă.
- Greșit: soluțiile apar în ordine aleatoare.Corect: ordinea este dată de ordinea în care sunt încercați candidații pe fiecare nivel.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
Documente consultate
- UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
- Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 4–5; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original), conform Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
