160 likes | 254 Views
Problema Bilei. Ultima poza facuta lui Lucian pana in ziua de azi. Gogo. Budinca. S. DESPRE. C. t. I. m. e. V. E. W. d. T. o. ,. Ne vine ideea sa folosim aceasta metoda daca: - se cer toate solutiile; - se cer combinatii, selectii de date dupa anumite criterii.
E N D
Problema Bilei Ultima poza facuta lui Lucian pana in ziua de azi Gogo Budinca
. S DESPRE C t I m e V E W d T o , 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. "bectreching" ?
D e C e a L e s am a c e a T ? s a problema Dumnezeu stie...
D e C e a L e s am a c e a T ? s a problema 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.
E L . N N T P L U U E B I E o m R , 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. Exemplu: Fie terenul alaturat. Initial, bila se afla pe subterenul de 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 retinute de matricea t.
liza Ana problemei Pentru conceperea corecta a unui algoritm, este utila o analiza a problemei date. Punem pe hartie cateva repere: • datele de intrare: configuratia terenului (matricea h), pozitia initiala a bilei (l0, c0). h[i][j] – inaltimea subterenului de pe linia i si coloana j.
liza Ana problemei 2) Vectorul solutie. 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, bila se afla in subterenul de coordonate (lin[i], col[i]). Asadar, initial lin[0]=l0 si col[0]=c0.
liza Ana problemei 3) Multimea valorilor posibile pentru o componenta a traseului. La pasul k, bila se poate afla in subterenul de coordonate lin[k] si col[k], valori calculate in functie de pozitia anterioara (lin[k-1], col[k-1]) si directia aleasa (0, 1, 2 sau 3). Fiecare dintre directii presupune o deplasare a bilei, pe linie sau pe coloana. Valorile cu care se modifica linia si coloana de deplasare sunt memorate in vectorii dl[4]={-1,0,1,0} si dc[4]={0,1,0,-1}. Deci d { 0, 1, 2, 3} lin[k]=lin[k-1]+dl[d]; col[k]=col[k-1]+dc[d]; 0 3 1 2
liza Ana problemei 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]])
liza Ana problemei 5) Solutie finala Se tipareste solutia, atunci cand bila a ajuns pe una dintre marginile terenului: (lin[k]==0 || lin[k]==n-1 || col[k]==0 ||col[k]==m-1)
Ge ne ra rea unei 0 3 1 2 L .. S T U 0 II ,
C D : C++ 0 #include <fstream.h> #include <conio.h> #include <iomanip.h> int h[20][20], lin[400], col[400]; int dl[4]={-1,0,1,0}; int dc[4]={0,1,0,-1}; int l0, c0, n, m; ofstream fo ("date.out"); void Citire() {ifstream f ("date.in"); f>>n; f>>m; for (int i=0; i<n; i++) for (int j=0; j<m; j++) f>>h[i][j]; f>>l0; f>>c0; f.close(); } int Solutie(int k) {if (lin[k]==0 || lin[k]==n-1 || col[k]==0 || col[k]==m-1) return 1; return 0; } int Valid(int k) {if (lin[k]<0 || col[k]<0 || lin[k]>=n || col[k]>=m) return 0; if (h[lin[k]][col[k]]>=h[lin[k-1]][col[k-1]]) return 0; return 1; } 1 2
void Tipar(int k) { int i, j, aux[20][20]; for(i=0;i<n;i++) for(j=0;j<m;j++) aux[i][j]=h[i][j]; 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; } fo<<endl<<endl; } void Back(int k) {for (int d=0; d<4; d++) {lin[k]=lin[k-1]+dl[d]; col[k]=col[k-1]+dc[d]; if (Valid(k)){if (Solutie(k)) Tipar(k); Back(k+1); } } } void main() {Citire(); lin[0]=l0; col[0]=c0; Back(1); fo.close(); } 3 4
L ! K n uri _ • Link:date.in • Link:date.out • Link:editare program • Link:rulare executabil
B i B L ! 0 g R A i E f Cativa din neuronii geniilor acestei echipe au colaborat pentru realizarea a ceea ce tocmai ati vazut.
^ C e v ? am I A t a T n , Am invatat: -sa lucram in echipa; -toate rutele pe care o bila le poate folosi pentru a iesi de pe un teren denivelat.