Sunteți pe pagina 1din 3

Backtracking iterativ

Observaţii generale :

i. toate problemele de mai jos admit o rezolvare printr-un algoritm de tip backtracking din cauza faptului că
au soluţii multiple care pot fi organizate sub formă de tablouri (unidimensionale).
ii. O soluţie se va genera într-o stivă st[ ] a cărei dimensiune (lungime) poate diferi de la o problemă la alta.
iii. Fiind vorba de o stivă, întotdeauna se lucrează la nivelul cel mai de sus (la fiecare pas), notat în continuare
k.
iv. Toate programele care se construiesc pe algoritmii de mai jos vor fi alcătuite din funcţiile: Init ( ),
Succesor( )(return 1 sau 0), Solutie ( )(return 1 sau 0), Valid ( )(return 1 sau 0), Tipar ( ), back( ), main( ).

1. Generarea permutărilor

Cerinţa problemei: Dată fiind mulţimea primelor n numere naturale, să se genereze toate variantele de aşezare a
elementelor mulţimii date.
De exemplu, pentru n = 4, deci A={1, 2, 3, 4} se vor genera următoarele tablouri soluţie:
(1,2,3,4); (1,2,4,3); (1,3,1,4);(1,3,2,4);(1,3,4,2); etc...
Observaţii :
- n, numărul total de elemente al mulţimii iniţiale se cunoaşte şi se citeşte de la tastatură.
- nivelul k curent al stivei se iniţializează pe un număr anterior primului element care poate intra într-o soluţie, în
speţă 0 aici, pentru ca primul număr acceptat în soluţie să fie 1, din perspectiva incrementării din funcţia Succesor()
- pentru că trebuie aşezate toate cele n elemente, deci un tablou soluţie va avea dimensiunea n, în funcţiile Soluţie ()
şi Tipar() trebuie să existe referiri la numărul n.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe n, deci funcţia Succesor() va conţine un test faţă
de n.
- deorece o soluţie trebuie să aibă toate elementele diferite, şi, din cauza faptului că soluţia se construieşte pas cu pas,
pe un nivel k al stivei, va fi acceptat un element doar dacă nu a mai fost pus în stivă, evident pe o poziţie inferioară lui
k. Funcţia Valid() va trebui aşadar să verifice dacă nu cumva mai există elementul care s-a pus pe poziţia k, undeva
mai jos în stivă, şi în caz afirmativ, întoarce 0 (cu acel element pe poziţia k nu sunt şanse să se ajungă la o soluţie)

2. Generarea aranjamentelor

Cerinţa problemei: Dată fiind mulţimea primelor n numere naturale, să se genereze toate variantale de aşezare a m
elemente din mulţimea dată. Se impune un exemplu (vezi generarea permutărilor)
Observaţii :
- n, numărul total de elemente al mulţimii iniţiale se cunoaşte şi se citeşte de la tastatură.
- m, numărul de elemente al unui aranjament se cunoaşte şi se citeşte de la tastatură.
- nivelul curent al stivei se iniţializează pe 0
- pentru că trebuie aşezate doar m elemente din cele n elemente totale, deci un tablou soluţie va avea dimensiunea m,
în funcţiile Soluţie () şi Tipar() trebuie să existe referiri la numărul m.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe n, deci funcţia Succesor() va conţine un test faţă
de n.
- deorece o soluţie trebuie să aibă toate elementele diferite, şi, din cauza faptului că soluţia se construieşte pas cu pas,
pe un nivel k al stivei, va fi acceptat un element doar dacă nu a mai fost pus în stivă, evident pe o poziţie inferioară lui
k. Funcţia Valid() va trebui aşadar să verifice dacă nu cumva mai există elementul care s-a pus pe poziţia k, undeva
mai jos în stivă, şi în caz afirmativ, întoarce 0 (cu acel element pe poziţia k nu sunt şanse să se ajungă la o soluţie)
3. Generarea combinărilor

Cerinţa problemei: Dată fiind mulţimea primelor n numere naturale, să se genereze toate submulţimile de m
elemente din mulţimea dată. Se impune un exemplu (vezi generarea permutărilor)
Observaţii :
- n, numărul total de elemente al mulţimii iniţiale se cunoaşte şi se citeşte de la tastatură.
- m, numărul de elemente al unei combinări se cunoaşte şi se citeşte de la tastatură.
- nivelul curent al stivei, st[k] se iniţializează pe valoarea st[k-1] din cauza modului special de construire al
combinărilor. Orice combinare este un şir ordonat de numere, asta înseamnă că pe nivelul k, prima valoare, cea care
este cu una mai înainte de prima valoare acceptată să fie exact următoarea valoare netratată, din perspectiva
incrementării cu 1 din funcţia Succesor ().
- pentru că trebuie aşezate doar m elemente din cele n elemente totale, deci un tablou soluţie va avea dimensiunea m,
în funcţiile Soluţie () şi Tipar() trebuie să existe referiri la numărul m.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe n, deci funcţia Succesor() va conţine un test faţă
de n.
- deorece o soluţie este un tablou strict crescător de numere, deci implicit elementele sale vor fi diferite între ele(din
construcţie) nu se impune nici o condiţie de validitate în funcţia Valid ().

4. Problema comis-voiajorului

Cerinţa problemei: Dându-se un număr de n oraşe şi configuraţia şoselelor care leagă oraşele date, se cere să se
afişeze toate variantele de parcurgere de către un comis-voiajor a unui traseu, începând cu oraşul 1 şi care să includă
toate cele n oraşe. Comis- voiajorul trebuie să treacă printr-un oraş o singură dată.
Configuraţia drumurilor existente între cele n oraşe se cunoaşte. Se impune un exemplu (grafic)
Observaţii :
- n, numărul de oraşe se cunoaşte şi se citeşte de la tastatură.
- configuraţia şoselelor se citeşte într-o matrice cu elemente doar cifre binare.
- nivelul curent al stivei, st[k] se iniţializează pe valoarea 1, adică se porneşte din oraşul 1
- pentru că trebuie aşezate n elemente , deci un tablou soluţie va avea dimensiunea n, în funcţiile Soluţie () şi Tipar()
trebuie să existe referiri la numărul n.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe n, deci funcţia Succesor() va conţine un test faţă
de n.
- se impun următoarele condiţii de validitate al unui număr pus pe nivelul k în stivă, reprezentând oraşul curent de
vizitat :
- trebuie să existe drum de la acest oraş la cel vizitat anterior (condiţie în care intervin elemente ale
matricii drumurilor)
- oraşele vizitate trebuie să fie diferite (nu se poate trece prin acelaşi oraş de două ori), adică trebuie
efectuat un test care să cerifice faptul că oraşul curent nu a mai fost vizitat înainte, nu trebuie să existe în stivă pe o
poziţie inferioară poziţiei curente numărul oraşului care se pune pe poziţia k
- în cazul în care se lucrează la ultimul nivel al stivei ( k= =n ), trebuie să existe drum de la acel oraş la
oraşul de pornire 1.
- în funcţia back (), k=2, pentru că întotdeauna k=1 este ocupat de oraşul 1, adică st[1]=1, care trebuie scris în main()
- în funcţia Tipar () se poate adăuga la sfârşitul fiecărei solutii generate şi numărul 1, pentru a se da impresia unui
circuit efectuat de comis-voiajor
5. Problema celor n regine

Cerinţa problemei: Să se genereze toate modalităţile de poziţionare a n regine pe o tablă de şah de dimensiune n x n.
Se impune un exemplu (grafic)
Observaţii :
- n, numărul de regine şi dimensiunea tablei de şah se cunoaşte şi se citeşte de la tastatură.
- se face convenţia că st[k]=i înseamnă că regina i se găseşte pe poziţia k, sau altfel zis pe poziţia [i][k] pe tablă se
găseşte o regină
- nivelul k curent al stivei se iniţializează pe un număr anterior primului element care poate intra într-o soluţie, în
speţă 0 aici, pentru ca primul număr acceptat în soluţie să fie 1, din perspectiva incrementării din funcţia Succesor()
- pentru că trebuie aşezate toate cele n elemente, deci un tablou soluţie va avea dimensiunea n, în funcţiile Soluţie ()
şi Tipar() trebuie să existe referiri la numărul n.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe n, deci funcţia Succesor() va conţine un test faţă
de n.
- deorece o soluţie trebuie să aibă toate elementele diferite, şi, din cauza faptului că soluţia se construieşte pas cu pas,
pe un nivel k al stivei, va fi acceptat un element doar dacă nu a mai fost pus în stivă, evident pe o poziţie inferioară lui
k. Funcţia Valid() va trebui aşadar să verifice dacă nu cumva mai există elementul care s-a pus pe poziţia k, undeva
mai jos în stivă, şi în caz afirmativ, întoarce 0 (cu acel element pe poziţia k nu sunt şanse să se ajungă la o soluţie). În
plus mai trebuie verificat dacă nu există o situaţie de conflict între regine.

6. Generarea produsului cartezian a n mulţimi

Cerinţa problemei: Date fiind n mulţimi să se genereze produsul lor cartezian.


Observaţii :
- se cunosc numărul elementelor mulţimilor al cărui produs cartezian se calculează, numere care se vor reţine într-un
tablou a
Pentru mulţimile
A1={1,2,3,4}
A2={1,2}
A3={1,2,3,4,5}
A4={1,2,3,4,5,6}
se construieşte tabloul a : 4 2 5 6
- nivelul k curent al stivei se iniţializează pe un număr anterior primului element care poate intra într-o soluţie, în
speţă 0 aici, pentru ca primul număr acceptat în soluţie să fie 1, din perspectiva incrementării din funcţia Succesor()
- pentru un tablou soluţie va avea dimensiunea n, în funcţiile Soluţie () şi Tipar() trebuie să existe referiri la numărul
n.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe a[k], deci funcţia Succesor() va conţine un test
faţă de a[k].
- se acceptă orice element ca fiind valid, în funcţia Valid () nu există condiţie suplimentară.

7. Generarea produsului cartezian a unei mulţimi de n elemente cu ea însăşi de m ori

Cerinţa problemei: Dată fiind o mulţime alcătuită din primele n elemente să se calculeze produsul cartezian al
mulţimii date cu ea însăşi de m ori
Observaţii :
- problemă analoagă problemei 6, mult simplificată însă, nu se mai impune utilzarea tabelului a, din cauza faptului că
nu se lucrează cu mai multe mulţimi
- nivelul k curent al stivei se iniţializează pe un număr anterior primului element care poate intra într-o soluţie, în
speţă 0 aici, pentru ca primul număr acceptat în soluţie să fie 1, din perspectiva incrementării din funcţia Succesor()
- pentru un tablou soluţie va avea dimensiunea m, în funcţiile Soluţie () şi Tipar() trebuie să existe referiri la numărul
m.
- pe nivelul k al stivei se acceptă orice element care nu depăşeşte pe n, deci funcţia Succesor() va conţine un test faţă
de a[k].
- se acceptă orice element ca fiind valid, în funcţia Valid () nu există condiţie suplimentară.

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