Sunteți pe pagina 1din 3

Backtracking

-in plan-

1. Spatiul de cautare este o matrice.


2. Exista un element mobil, fiind specificate clar regulile de miscare.
3. Vectori de directii (pornind din Nord in sensul acelor de ceasornic) pentru:

a. 4 directii adiacente
int dl = {-1, 0, 1, 0};
int dc= {0, 1, 0, -1};

b. 8 directii adiacente:
int dl = {-1, -1, 0, 1, 1, 1, 0, -1};
int dc= {0, 1, 1, 1, 0, -1, -1, -1};

c. saritura calului:
int dl = {-2, -1, 1, 2, 2, 1, 2};
int dc= {1, 2, 2, 1, -1, -2, -1};

4. Se cere determinarea:
a. tuturor solutiilor;
b. unei solutii optime

!!! Daca trebuie sa determinam drumul de lungime minima, NU este BKT.


!!! In acest caz este Lee.

Daca se cere determinarea unui drum de cost minim/maxim si deplasarile se fac


restrictionat pe o anumita directie, este vorba de programare dinamica.
Daca se cere drumul de lungime maxima, este BKT (pentru ca e necesar sa vizitam
toate posibilitatile).

Obs: Pentru a nu iesi din matrice pe parcursul cautarii, eficient ar fi sa bordam matricea
plasand pe bordura o valoare care impiedica deplasarea.

void bkt(int lin, int col){


if (am_gasit_o_solutie()) prelucrez_solutia();
else for (k=0; k<NrDir; k++) {
lin_vecin = lin + dl[k];
col_vecin = col + dc[k];
if (posibila_mutare(lin_vecin, col_vecin)){
bkt(lin_vecin, col_vecin);
}
}
}
Exercitii:
1. http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=713
2. Calul si regele
Pe o tabla de sah cu n linii si m coloane se afla in doua pozitii cunoscute xc,
yc si xr, yr, un cal, respectiv un rege.
Gasiti o posibilitate sa deplasam calul din pozitia sa initiala pana la pozitia
regelui, dupa care calul il ia in spate si se intoarace de unde a venit. Calul nu are
voie sa viziteze de doua ori aceeasi pozitie.

jucarii-campion (solutie)
1. Generam permutari
2. Daca o permutare respecta cele 2 conditii: sa contina un sir crescator de lungime>=K
(din enunt) si sa fie completa k==n+1 atunci:
a. numaram permutarea
b. cand ajungem la NR-a permutare, o afisam

sol[k] = elem din permutare de pe pozitia k


dp[k] = lungimea celui mai lung subsir de elemente crescatoare care
il contine pe sol[k]

dp[k] = max {dp[j] + 1, dacaa sol[k] > sol[j]}


j=1..k

sol 1 3 4 5

lg 2 3 4

…..j.…. k

Tema

1. Fill
- drenaj : http://campion.edu.ro/arhiva/index.php?
page=problem&action=view&id=1195
- betasah (fill fara recursivitate) http://campion.edu.ro/arhiva/index.php?
page=problem&action=view&id=1503
2. BKT in plan
- http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=1072
(programare dinamica - neaparat de discutat)
- http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=1078
- https://www.pbinfo.ro/probleme/2355/card (BONUS)

3. BKT varianta elementara


- http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=1087
(usoara)
- http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=477
-

Contact:
albert.ramona99@gmail.com

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