Cuprins

Laborator 12: Backtracking

1 Obiectivele laboratorului

2 Backtracking

2.1 Definiție

Noțiunea de backtracking se referă la utilizarea unui algoritm recursiv pentru soluționarea unei probleme ce admite soluții parțiale. Se începe cu una din bucățile de soluție disponibile și se avansează până la construirea soluției complete. Dacă una din rutele de construcție disponibile nu duce nicăieri, se merge înapoi (backtrack) și se încearcă altă cale. Dacă niciuna din rute nu dă o soluție, atunci problema nu este rezolvabilă.

2.2 Algoritm

Algoritmul generat este următorul:

  • Se alege un punct de start
  • Cât timp problema nu este rezolvată:
    • Pentru fiecare cale(parte din soluție disponibilă) de la punctul de start:
      • Se verifică dacă ruta aleasă este bună (nu invalidează condiția de rezolvare)
      • Daca da, se adaugă la soluția în construcție și se apelează recursiv algoritmul pentru restul problemei
      • Dacă apelul recursiv reușește să găsească o soluție completă,algoritmul se încheie. Dacă nu, ruta aleasă se elimină din soluție și se alege alta.
  • Daca niciuna din căile disponibile nu este bună, nu există soluție (pentru punctul de start ales).

3 Probleme rezolvate prin tehnica backtracking

3.1 Căutarea unui cuvânt într-o matrice

Dată fiind o matrice 2D de caractere, să se verifice dacă există un cuvânt în matrice. Dacă da,să i se afișeze calea. Se permite mișcarea în toate cele 8 direcții.

Procedeu:


Mai jos este matricea de soluții pentru căutarea cuvântului „horizon“ în cea de mai sus.
Se notează cu 0 celulele neutilizate.

3.2 Problema spargerii cuvintelor

Fiind dar un și de caractere și un dicționar de cuvinte, să se verifice dacă șirul poate fi spart în cuvinte din dicționar și ,dacă da, să se afișeze acestea cu spațiu între ele.

Procedeu naiv:


Procedeu cu programare dinamică:

4 Exerciţii

  1. Generarea produsului cartezian AN (interpretare: toate numerele de N cifre, dar cu cifrele alese numai din mulțimea A). Exemplu: A = {1,2,3}, N = 6;
  2. Generarea tuturor permutărilor de N;
  3. Generarea tuturor combinărilor/aranjamentelor de N luate câte k;
  4. Problema calului pe tabla de şah;
  5. * Problema turelor pe tabla de şah;
  6. Problema reginelor pe tabla de şah;
  7. Găsirea unui lanţ Hamiltonian într-un graf;
  8. * Găsirea unui ciclu Hamiltonian într-un graf;
  9. Problema comisului-voiajor;

5. Exerciţii de laborator (Linux)

Pentru acest laborator puteți descărca scheletul de cod de aici. Descărcați arhiva și dezarhivați-o.

Linux

Puteti folosi utilitarul wget pentru descarcare si utilitarul unzip pentru dezarhivare.

Pentru compilare folositi comanda make.