Sunteți pe pagina 1din 16

Ne vine ideea sa folosim aceasta metoda daca:

- se cer toate solutiile;


- se cer combinatii, selectii de date dupa anumite criterii.

Metoda se poate aplica daca:


- o solutie se poate exprima ca un vector;
- daca fiecare element al vectorului  unei multimi finite.
Dumnezeu stie... 
De fapt, Budinca a ales problema
pentru ca i-a placut cum suna, Gogo
pentru ca asa i-a spus Budinca, iar
Lucian A FOST NEVOIT sa fie de acord.
Se da un teren sub forma de matrice cu n linii si m coloane. Fiecare element al
matricei reprezinta un subteren cu o anumita altitudine data de valoarea
retinuta de element (numar natural). Intr-un astfel de subteren, de coordonate
(lin, col) se gaseste o bila. Stiind ca bila se poate deplasa in orice portiune de
teren aflata la nord, est, sud sau vest, de altitudine strict inferioara portiunii pe
care se gaseste bila. Se cere sa se gaseasca toate posibilitatile ca bila sa
paraseasca terenul.

6 8 9 3
Exemplu: Fie terenul alaturat. Initial, bila se afla pe subterenul de 9 7 6 9
coordonate (2,2). O posibilitate de iesire din teren este data de drumul:
(2,2), (2,3), (3,3), (3,4). In program, altitudinile subterenului vor fi 5 8 5 4
retinute de matricea t.
8 3 7 1
6 8 9 3

9 7 6 9

Pentru conceperea corecta a unui


algoritm, este utila o analiza a 5 8 5 4
problemei date.
Punem pe hartie cateva repere:
1)datele de intrare: configuratia
terenului (matricea h), pozitia initiala 8 3 7 1
a bilei (l0, c0).
h[i][j] – inaltimea subterenului de
pe linia i si coloana j.
6 8 9 3

9 7 6 9

2) Vectorul solutie. 5 8 5 4
O solutie este o succesiune de
subterenuri prin care bila poate
trece pentru a iesi de pe terenul
dat. Reprezentam solutia prin doi
vectori, lin respectiv col. La pasul i, 8 3 7 1
bila se afla in subterenul de
coordonate (lin[i], col[i]). Asadar,
initial lin[0]=l0 si col[0]=c0.
6 8 9 3
3) Multimea valorilor posibile pentru
o componenta a traseului. 0
La pasul k, bila se poate afla in
subterenul de coordonate lin[k] si
col[k], valori calculate in functie de 9 3 7 1 6 9
pozitia anterioara (lin[k-1], col[k-1]) si
directia aleasa (0, 1, 2 sau 3). Fiecare 2
dintre directii presupune o deplasare a
bilei, pe linie sau pe coloana. Valorile
cu care se modifica linia si coloana de 5 8 5 4
deplasare sunt memorate in vectorii
dl[4]={-1,0,1,0} si
dc[4]={0,1,0,-1}.
Deci d  { 0, 1, 2, 3} 8 3 7 1
lin[k]=lin[k-1]+dl[d];
col[k]=col[k-1]+dc[d];
4) Validarea datelor
Pentru ca bila sa poata ajunge in subterenul de coordonate (lin[k],
col[k]), trebuie indeplinite conditiile:
-subterenul sa apartina terenului, deci (lin[k]>=0 && col[k]>=0 &&
lin[k]<n && col[k]<m)
-subterenul sa aiba o inaltime mai mica decat precedentul: (h[lin[k]]
[col[k]]<h[lin[k-1]][col[k-1]])
6 8 9 3

9 7 6 9

5) Solutie finala
Se tipareste solutia, atunci cand 5 8 5 4
bila a ajuns pe una dintre marginile
terenului: (lin[k]==0 || lin[k]==n-1 ||
col[k]==0 || col[k]==m-1)
8 3 7 1
6 8 9 3
0

9 3 7 1 6 9
2

5 8 5 4

8 3 7 1
#include <fstream.h>
#include <conio.h>
#include <iomanip.h>

int h[20][20], lin[400],


col[400]; int Solutie(int k)
int dl[4]={-1,0,1,0}; {if (lin[k]==0 ||
int dc[4]={0,1,0,-1}; lin[k]==n-1 ||
int l0, c0, n, m; col[k]==0 ||
col[k]==m-1) return 1;
ofstream fo ("date.out"); return 0;
}
void Citire()
{ifstream f ("date.in"); int Valid (int k)
f>>n;
{if (lin[k]<0 || col[k]<0 ||
f>>m;
lin[k]>=n || col[k]>=m) return 0;
for (int i=0; i<n; i++)
for (int j=0; j<m; j+
if (h[lin[k]][col[k]]>=h[lin[k-1]][col[k-1]])
+) return 0;
f>>h[i][j]; return 1;
f>>l0; }
f>>c0;
f.close();
}

1 2
void Back(int k)
void Tipar(int k) {for (int d=0; d<4; d++)
{ int i, j, aux[20][20]; {lin[k]=lin[k-1]+dl[d];
for(i=0;i<n;i++) col[k]=col[k-1]+dc[d];
for(j=0;j<m;j++) if (Valid(k)){if (Solutie(k))
aux[i][j]=h[i][j]; Tipar(k);
Back(k+1);
for (i=0; i<=k; i++) }
aux[lin[i]][col[i]]=-1; }
}
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
fo<<setw(4)<<aux[i][j];
fo<<endl; void main()
} {Citire();
fo<<endl<<endl; lin[0]=l0; col[0]=c0;
} Back(1);
fo.close();
}

3 4
• Link: date.in
• Link: date.out
• Link: editare program
• Link: rulare executabil
Cativa din neuronii geniilor acestei
echipe au colaborat pentru realizarea a
ceea ce tocmai ati vazut.
Am invatat:
-sa lucram in echipa;
-toate rutele pe care o bila le poate folosi
pentru a iesi de pe un teren denivelat.

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