home


 * media type="youtube" key="MBvGarFn5dI" height="385" width="480" align="right"Backtrackingul** este o metoda conceputa pentru rezolvarea problemelor ce presupun generarea mai multor solutii sub forma de vector. Aceasta se utilizeaza atunci cand nu este disponibila o alta alternativa datorita faptului ca scrierea sa presupune ocuparea unui spatiu relativ mare din memoria calculatorului. Solutiile trebuie sa apartin unor multimi finite, iar elementele lor sa fie intr-o relatie de ordine.

Pentru a inţelege mai bine metoda Backtracking, vom lua un exemplu concret: se doreşte generarea tuturor permutărilor din mulţimea {1,2,3,4}. Numarul solutiilor va fi n!, in cazul nostru n fiind 4. Soluţiile vor fi următoarele:


 * 1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4313, 4321**

Programul de generare al permutarilor:
int st[20],k,n;
 * 1) include
 * 2) include

k va masura nivelul din stiva, //iar n va fi numarul de elemente din multimea pe care se lucreaza...// la permutari nivelul maxim va fi egal cu numarul de elemente din multime.

void init { st[k]=0; // subprogramul initializeaza pozitia k din stiva cu 0 la fiecare apelare // //}//

//int succesor// //{// //if(st[k]<n) //// se verifica daca elementul de pe pozitia k din stiva este mai mic decat n {st[k]++; //va creste cu 1; return 1;} else return 0; } //// subprogramul returneaza 1 pentru a arata ca mai exista cel putin un succesor si 0 in caz contrar. // //int valid// //permutarea presupune elemente distincte pe stiva asa ca subprogramul valid are rolul de a verifica daca elementul pus la nivelul k a mai fost folosit la un nivel anterior. { int i; for(i=1;i<k;i++) //// se utilizeaza o instructiune de repetitie pentru a parcurge stiva pana la nivelul k-1 // //if (st[k]==st[i]) return 0;// // se verifica daca elementul de la fiecare nivel in parte return1; //coincide cu cel de la nivelul k } //int solutie// //{// //if(k==n) return 1;//// daca nivelul stivei a ajuns la n, nivelul maxim, atunci se va returna 1 , return 0; //rezultand o solutie...in caz contrar se va returna 0 } void tipar// // se parcurge stiva complet si se tiparesc elementele solutiei // //{ int i;// //for(i=1;i<=n;i++)// //cout<<st[i]<<" ";// //cout<0) // cand k ia valoarea 0 se paraseste subprogramul; // //{// //do{// //as=succesor;// in variabila as se va pune valoarea ce rezulta din apelarea subprogramului succesor (*vezi subprogramul succesor); if(as==1) ev=valid; // daca elementul de pe nivelul k are succesor atunci se verifica daca e valid iar in variabila ev va intra valoarea ce rezulta din apelarea subprogramului 1 daca e valid si 0 in caz contrar (*vezi subprogramul valid) // //}while(as==1&&ev==0);// aceasta instructiune de repetitie se va efectua cat timp elementul de pe pozitia k are succesor si acesta nu e valid if(as==1) // daca elementul de pe pozitia k are succesor se vor efectua urmatoarele instructiuni; // //if(solutie==1) tipar;// daca nivelul k va ajunge la n inseamna ca s-a reusit crearea unei solutii si se va trece la tiparirea ei (*vezi subprogramele solutie si respectiv tipar) else { k++; init; } // daca nivelul k nu a ajuns la n atunci solutia nu e completa deci se creste nivelul si se initializeaza cu 0 (*vezi subprogramul init) // //else k--;// daca nu are succesor atunci nivelul scade ; } }

void main { clrscr; cin>>n ; // se citeste nr de elemente din multime // //back;// apelam subprogramul back getch; }


 * Pentru a intelege mai bine metoda va invitam sa urmariti implementarea backtrackingului in cateva prezentari realizate de elevii Cosbucului:**



Va sfatuim sa va creati conturi [|OpenID] sau Wikispaces si sa va alaturati diferitelor discutii prin intermediul butonului DISCUSSION

Pentru sugestii contactati-ne pe Skype media type="skypestatus" key="petruut" ARG0="balloon" height="60" width="150"