0% found this document useful (0 votes)
89 views24 pages

Sda Probleme

The document discusses various algorithms related to trees, graphs, and dynamic programming. It includes functions to create and traverse binary search trees, AVL trees, graphs represented using adjacency matrices, and dynamic programming solutions to calculate Fibonacci numbers and combinations.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
89 views24 pages

Sda Probleme

The document discusses various algorithms related to trees, graphs, and dynamic programming. It includes functions to create and traverse binary search trees, AVL trees, graphs represented using adjacency matrices, and dynamic programming solutions to calculate Fibonacci numbers and combinations.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 24

PNOD arboreDinVector(int *v, int dim){ PNOD rad = new NOD, temp, radTemp; if(!

rad){cout << "Nu mai este loc liber in memorie"; return rad;}rad->informatie = v[0]; rad->ss = NULL;rad->sd = NULL; for(int i = 1; i < dim; i++){ temp = new NOD;if(!temp){ cout << "Nu mai este loc liber in memorie"; return rad;}temp->informatie = v[i]; temp->ss = NULL;temp->sd = NULL; radTemp = rad;while(radTemp){ if(radTemp->informatie > v[i]) if(radTemp->ss == NULL){ radTemp->ss = temp;break;} else radTemp = radTemp->ss; else if(radTemp->sd == NULL){ radTemp->sd = temp;break;} else radTemp = radTemp->sd;}} return rad;}

void stergeArbore(PNOD rad){ if(rad->ss) stergeArbore(rad->ss);

if(rad->sd) stergeArbore(rad->sd); delete rad;}

int nrNoduri(PNOD rad){ if ( rad == NULL ) return 0; return (1 + nrNoduri(rad->ss) + nrNoduri(rad->sd));}

int inaltime(PNOD rad){ if ( rad == NULL ) return 0; int inaltimeSS, inaltimeSD; inaltimeSS = inaltime(rad->ss);inaltimeSD = inaltime(rad->sd); return (inaltimeSS>inaltimeSD)?(inaltimeSS+1):(inaltimeSD+1); } void calculEchilibru(PNODAVL rad){ rad->echilibru = inaltimeAVL(rad->sd) - inaltimeAVL(rad->ss);

PNODAVL echilibrare(PNODAVL rad){ PNODAVL temp;calculEchilibru(rad); if(rad->echilibru == -2){temp = rad->ss; if (temp->echilibru == 1) rad = dRotireDreapta(rad); else rad = sRotireDreapta(rad);} else if(rad->echilibru == 2){temp = rad->sd; if (temp->echilibru == -1) rad = dRotireStanga(rad); else rad = sRotireStanga(rad);} return rad;}

PNODAVL insereazaAVL(PNODAVL rad, int nr){ if(!rad){ rad = new NODAVL; rad->informatie = nr; rad->echilibru = 0; rad->sd = NULL;rad->ss = NULL;return rad;} else if (nr < rad->informatie) rad->ss = insereazaAVL(rad->ss, nr); else if (nr > rad->informatie) rad->sd = insereazaAVL(rad->sd, nr); else printf("Nodul exista deja");rad = echilibrare(rad);return rad;}

PNODAVL removeMin(PNODAVL rad){ PNODAVL temp = rad;if (!rad) cout << "arbore gol" << endl; else if (rad->ss) rad->ss = removeMin(rad->ss); else{ rad = rad->sd;//leg sd si eliberez radacina delete temp;} return rad;}

Backtracking int S[NMAX];int nrSolutii; void initializareSolutie(int row){S[row] = 0;} bool potCompletaSolutia(int row, int N){ bool rez = false;while((!rez)&&(S[row]<N)){ S[row]++; rez = true;for (int i = 1; i<row; i++) if((S[row]==S[i])||(abs(S[row]-S[i]) == (abs(row-i)))) rez = false;} return rez;}bool solutieFinala(int row, int N){

return (row==N);}void tiparesteSolutia(int N){ for(int i = 1; i<=N; i++) cout << S[i] << "\t"; cout << endl;}void backtrackingInterativ(int N){ int row = 1;initializareSolutie(row); while (row > 0){if(potCompletaSolutia(row, N)) if(solutieFinala(row, N)){tiparesteSolutia(N); nrSolutii++;}else{row++;initializareSolutie(row);} else row--;}} void backtrackingRecursiv(int N, int row){ if(row == N+1) tiparesteSolutia(N); else{int i, j; bool rez; for(i = 1; i <= N; i++){S[row] = i; rez = true;for(j = 1; j < row; j++) if((S[row]==S[j])||(abs(S[row]-S[j]) == (abs(row-j)))) rez = false; if(rez) backtrackingRecursiv(N, row + 1);}} S[row] = 0;}

PNODAVL stergeNodAVLechil(int nr, PNODAVL rad){ if((rad->ss == NULL)&&(rad->sd == NULL)) {delete rad; return NULL;} PNODAVL curent = rad, anterior = NULL;while(curent){ if(nr < curent->informatie) {anterior = curent; curent = curent->ss;} else if(nr > curent->informatie) {anterior = curent; curent = curent->sd;} else if(curent->ss != NULL && curent->sd != NULL){ PNODAVL temp = curent->sd, anteriorTemp = NULL; while(temp->ss){ anteriorTemp = temp; temp = temp->ss;} curent->informatie removeMin(curent->sd); if(anteriorTemp) >informatie);break;} else{ PNODAVL temp;temp = (curent->ss != NULL) ? curent->ss : curent>sd; if(anterior == NULL) return temp;if(anterior->ss->informatie == nr) anterior->ss = temp; else anterior->sd = temp;rad = reechilibrare(rad, anterior->informatie); delete curent;break;}}if (!curent) cout << "nu exista acest nr in arbore" << endl; return rad;} rad = reechilibrare(rad, anteriorTemp= temp->informatie;curent->sd =

typedef int info;typedef struct varf{

info informatie; varf *varfUrmator; struct arc *capListaArce;} VARF, *PVARF; typedef struct arc{PVARF varfDestinatie; int pondereLegatura;arc *arculUrmator;} ARC, *PARC; typedef struct stiva{PVARF varf; stiva *urmatorulDinStiva;} STIVA, *PSTIVA; typedef struct lista{PVARF varf; lista *urmatorulDinCoada;} LISTA, *PLISTA; typedef struct{PLISTA inceput;PLISTA sfarsit; } COADA;

PVARF grafDinMatriceAdiacenta(int matrice[nrVarfuri][nrVarfuri], int nr){ if(nr <= 0) return NULL;PVARF primulVarf = NULL, temp; for(int i = 0; i< nr; i++) primulVarf = inserareVarfNou(primulVarf, i+1); temp = primulVarf;for(int i = 0; i < nr; i++) for(int j = 0; j < nr; j++) if(matrice[i][j])inserareArcNou(primulVarf, i+1, j+1, matrice[i][j]); return primulVarf;}

PVARF inserareVarfNou(PVARF primulVarf, int informatie){ PVARF varfNou = new VARF;varfNou->informatie = informatie; varfNou->varfUrmator = NULL;varfNou->capListaArce = NULL;

if(!primulVarf) return varfNou;PVARF temp = primulVarf; while(temp->varfUrmator) temp = temp->varfUrmator; temp->varfUrmator = varfNou;return primulVarf;}

PVARF cautVarf(PVARF primulVarf, int informatie){ while(primulVarf) if((primulVarf->informatie) != informatie) primulVarf = primulVarf->varfUrmator ; else break;return primulVarf;}

void inserareArcNou(PVARF primulVarf, int sursa, int destinatie, int pondere){ PVARF varfSursa = NULL, varfDestinatie = NULL, tempVarf = primulVarf, ultimulVarf = primulVarf; varfSursa = cautVarf(primulVarf, sursa);varfDestinatie =

cautVarf(primulVarf, destinatie); while(ultimulVarf->varfUrmator) >varfUrmator; if(!varfSursa){primulVarf = inserareVarfNou(primulVarf, sursa); ultimulVarf = ultimulVarf->varfUrmator;varfSursa = ultimulVarf;} ultimulVarf = ultimulVarf-

if(!varfDestinatie){primulVarf destinatie);

inserareVarfNou(primulVarf,

ultimulVarf = ultimulVarf->varfUrmator;varfDestinatie = ultimulVarf;} PARC tempArc, arcNou;tempArc = varfSursa->capListaArce; if(!tempArc){arcNou = new ARC;arcNou->arculUrmator = NULL; arcNou->varfDestinatie = varfDestinatie; varfSursa->capListaArce = arcNou;return;} while(tempArc->arculUrmator){ if(tempArc->varfDestinatie->informatie tempArc->arculUrmator; else break;}if(tempArc->varfDestinatie->informatie != destinatie){ arcNou = new ARC;arcNou->arculUrmator = NULL; arcNou->varfDestinatie = varfDestinatie;tempArc->arculUrmator arcNou;} } = != destinatie) tempArc =

void vizitareVarf(PVARF varf, bool vizitat[]){ vizitat[varf->informatie-1] = true;}

void parcurgereGrafInAdancime(PVARF primulVarf){ if(!primulVarf) return;bool vizitat[10];int nr_noduri = 0; PVARF varfCurent = primulVarf;while(varfCurent){ vizitat[nr_noduri] = false;nr_noduri++;

varfCurent = varfCurent->varfUrmator;} PVARF varfPop;PARC tempArc; PSTIVA varfStiva = NULL; varfStiva = push(varfStiva, primulVarf); vizitareVarf(varfStiva->varf, vizitat); cout << varfStiva->varf->informatie; do{varfStiva = pop(varfStiva, &varfPop); varfCurent = varfPop; tempArc = varfCurent->capListaArce; while(tempArc){ if(!vizitat[tempArc->varfDestinatie->informatie-1]){ varfStiva = push(varfStiva, tempArc->varfDestinatie); vizitareVarf(varfStiva->varf, vizitat);cout << varfStiva->varf->informatie;} tempArc = tempArc->arculUrmator; }}while(varfStiva); void parcurgereGrafInLatime(PVARF primulVarf){ if(!primulVarf) return;bool vizitat[10]; int nr_noduri = 0;PVARF varfCurent = primulVarf; while(varfCurent){vizitat[nr_noduri] = false; nr_noduri++;varfCurent = varfCurent->varfUrmator;} PVARF varfExtras;PARC tempArc; COADA coada = {NULL, NULL}; coada = introduceCoada(coada, primulVarf);

vizitareVarf(coada.sfarsit->varf, vizitat); cout << coada.sfarsit->varf->informatie; do{coada = extrageCoada(coada, &varfExtras); varfCurent = varfExtras;tempArc = varfCurent->capListaArce; while(tempArc){if(!vizitat[tempArc->varfDestinatie->informatie-1]){ coada = introduceCoada(coada, tempArc->varfDestinatie); vizitareVarf(coada.sfarsit->varf, vizitat);cout << coada.sfarsit->varf>informatie;} tempArc = tempArc->arculUrmator;}}while(coada.inceput);}

void stergeGraf(PVARF primulVarf){ if(!primulVarf) return;stergeGraf(primulVarf->varfUrmator); PARC temp;while(primulVarf->capListaArce){ temp = primulVarf->capListaArce; primulVarf->capListaArce = primulVarf->capListaArce->arculUrmator; delete temp;}delete primulVarf;}

void bubbleSort1(){ bool sortat;int i, temp;do{sortat = true; for(i=0; i < N-1; i++) if(v[i] > v[i+1]){ temp = v[i];v[i] = v[i+1];v[i+1] = temp;sortat = false;} } while(!sortat);}void

bubbleSort(){bool sortat; int i, temp, n = N;do{sortat = true; for(i=0; i < n-1; i++) if(v[i] > v[i+1]){ temp = v[i];v[i] = v[i+1];v[i+1] = temp; sortat = false;}n--;} while(!sortat);} int main(){int i; for(i=0; i< N; i++) cout << vInitial[i] << "\t"; cout << endl; for(i=0; i< N; i++) v[i] = vInitial[i];bubbleSort1(); for(i=0; i< N; i++) cout << v[i] << "\t"; cout << endl; for(i=0; i< N; i++) v[i] = vInitial[i];bubbleSort(); for(i=0; i< N; i++) cout << v[i] << "\t"; cout << endl; system("PAUSE");return 0;}

Programare dinamica int fibonacci_rec(int n){ if(n==0) return 0;if(n==1) return 1; return fibonacci_rec(n-2) + fibonacci_rec(n-1);} int fibonacci_pd1(int n){if(n==0) return 0; if(n==1) return 1;if (memo[n-2]) return memo[n-2]; memo[n-2] = fibonacci_pd1(n-2) + fibonacci_pd1(n-1);

return memo[n-2];} int fibonacci_pd2(int n){if(n==0) return 0; if(n==1) return 1;static int memo_local[N]; if (memo_local[n-2]) return memo_local[n-2]; memo_local[n-2] = fibonacci_pd2(n-2) + fibonacci_pd2(n-1); return memo[n-2];} int combinari_rec(int n, int k){ if (k == 0) return 1; if (n == 0) return 0; return combinari_rec(n-1, k) + combinari_rec(n-1, k-1);} int combinari_pd(int n, int k){ static int comb[N+1][N+1]; for (int k_index = 1; k_index <= k; k_index++) comb[0][k_index] = 0; for (int n_index = 0; n_index <= N; n_index++) comb[n_index][0] = 1; for (int n_index = 1; n_index <= n; n_index++) for (int k_index = 1; k_index <= k; k_index++) comb[n_index][k_index] comb[n_index-1][k_index]; return comb[n][k];} DAME int S[NMAX]; int nrSolutii;void tiparesteSolutia(int N){ for(int i=1; i<=N; i++) cout<<S[i]<<"\t"; cout<<endl;}void initializareSolutie(int row){ S[row]=0;}bool potCompletaSolutia(int row, int N){ = comb[n_index-1][k_index-1] +

bool rez=false;while((!rez)&&(S[row]<N)){ S[row]++;rez=true; for(int i=1; i<row; i++) if((S[row]==S[i])||(abs(S[row]-S[i])==abs(row-i)))rez=false; } return rez;}bool solutiaFinala(int row, int N){return(row==N);} void backtrackingIterativ(int N){ int row=1; initializareSolutie(row);while(row>0){ if(potCompletaSolutia(row,N)) if(solutiaFinala(row,N)){ tiparesteSolutia(N); nrSolutii++;}else{ row++;initializareSolutie(row);} else row--;}} void backtrackingRecursiv(int N, int row){ if(row==N+1)tiparesteSolutia(N); else{ int i,j; bool rez; for(i=1; i<=N; i++){S[row]=i; rez=true; for(j=1; j<row; j++) if((S[row]==S[j])||(abs(S[row]-S[j])==abs(row-j)))rez=false; if(rez)backtrackingRecursiv(N,row+1);}} S[row]=0;}

Harti int S[10],n,mat[10][10]; void initializareSolutie(int k){ S[k]=0;} bool succesor(int k){bool rez=false; if(S[k]<4){S[k]=S[k]+1; rez=true; } return rez;} bool potCompletaSolutia(int k){

bool rez=true; for(int i=1; i<=k; i++) if((mat[i][k]==1)&&(S[i]==S[k]))rez=false; return rez;} bool solutieFinala(int k){ return(k==n);} void tiparesteSolutia(){cout<<"Solutie:"<<endl; for(int i=1; i<=n; i++) cout<<"Tara "<<i<<" este colorata cu culoarea "<<S[i]<<"."<<endl; cout<<endl;} void backtrackingIterativ(){ int k=1;initializareSolutie(k);while(k>0){ while(succesor(k)){if(potCompletaSolutia(k)) if(solutieFinala(k)) tiparesteSolutia();else{k++; int itializareSolutie(k);}}k--; }

void quickSort(int inceput, int sfarsit) int i = inceput, j = sfarsit, pivot, temp; pivot = v[(inceput+sfarsit)/2];do{ while(v[i] < pivot) i++;while(v[j] > pivot) j--; if(i <= j){temp = v[i];v[i] = v[j]; v[j] = temp; i++; j--;}while(i<j);if(inceput < j) quickSort(inceput,j); if(i < sfarsit) quickSort(i,sfarsit); }

int cautareBinara(int inceput, int sfarsit, int n){ int pozitie = -1, mijloc;mijloc = (inceput + sfarsit)/2; if(v[mijloc] == n) return mijloc; if((inceput == sfarsit)&&(pozitie < 0)) return -1; if(v[mijloc] < n) pozitie = cautareBinara(mijloc + 1, sfarsit, n); if(v[mijloc] > n) pozitie = cautareBinara(inceput, mijloc - 1, n); else return pozitie;}

void interclasare(int inceput1, int sfarsit1, int inceput2, int sfarsit2){ int vTemp[N], dim_vTemp, i = inceput1, j = inceput2, k = 0; dim_vTemp = sfarsit1 - inceput1 + 1 + sfarsit2 - inceput2 + 1; while((i <= sfarsit1) && (j <= sfarsit2)){if(v[i] < v[j]){ vTemp[k] = v[i];i++;}else{vTemp[k] = v[j];j++;}k++;} while(i <= sfarsit1){vTemp[k] = v[i];i++;k++;}

//sau while(j <= sfarsit2){vTemp[k] = v[j];j++;k++;} for(k = 0; k <= sfarsit1 - inceput1; k++) v[inceput1+k] = vTemp[k]; for(k = sfarsit1-inceput1 +1; k <= (sfarsit1 - inceput1 + 1) + (sfarsit2 inceput2); k++) v[inceput2+(k-sfarsit1+inceput1-1)] = vTemp[k];}

1) Introducere stiva PSTIVA push(PSTIVA varfStiva, PVARF varf){ PSTIVA temp = new STIVA;//noul element din stiva if(temp){ temp->urmatorulDinStiva = varfStiva; temp->varf = varf; } return temp; } 2) Stergere stiva PSTIVA pop(PSTIVA varfStiva, PVARF *pPVarf){ if(!varfStiva) return NULL; PSTIVA varfSters; varfSters = varfStiva; varfStiva = varfStiva->urmatorulDinStiva; *pPVarf = varfSters->varf; delete varfSters; return varfStiva;

3) Introducere coada COADA push(COADA coada, PVARF varf){ PLISTA nou = new LISTA; nou->varf= varf; nou->urmatorulDinCoada = NULL; if(!coada.inceput) coada.sfarsit = coada.inceput = nou; else{ coada.sfarsit->urmatorulDinCoada = nou; coada.sfarsit = nou; } return coada; }

Scoatere coada COADA pop(COADA coada, PVARF *pPVarf){ if(!coada.inceput) return coada; *pPVarf = coada.inceput->varf; PLISTA temp; temp = coada.inceput;

coada.inceput = coada.inceput->urmatorulDinCoada; delete temp; if(!coada.inceput) coada.sfarsit = NULL; return coada; }

4) Parcurgere graf in lungime void parcurgereGrafInAdancimeRecursiv(PVARF primulVarf){/ if(!primulVarf) return; static bool vizitat[nrVarfuri];//avem un graf, pe care il parcurgem in adancime vizitat[primulVarf->informatie-1] = true; cout << primulVarf->informatie; PARC tempArc = primulVarf->capListaArce; while(tempArc) if(!vizitat[tempArc->varfDestinatie->informatie-1]) parcurgereGrafInAdancimeRecursiv(tempArc->varfDestinatie); tempArc = tempArc->arculUrmator;}}

5) Rotire simpla la dreapta PNODAVL sRotireDreapta(PNODAVL rad){//rotire simpla dreapta PNODAVL temp; temp = rad->ss; rad->ss = temp->sd; temp->sd = rad;

calculEchilibru(rad); calculEchilibru(temp); rad = temp; return rad;} 6) Rotire dubla dreapta PNODAVL dRotireDreapta(PNODAVL rad){//rotire dubla left-right rad->ss = sRotireStanga(rad->ss); rad = sRotireDreapta(rad); return rad;}

7) Rotire stanga PNODAVL sRotireStanga(PNODAVL rad){//rotire simpla stanga PNODAVL temp; temp = rad->sd; rad->sd = temp->ss; temp->ss = rad; calculEchilibru(rad); calculEchilibru(temp); rad = temp; return rad;}

8) Rotire dubla stanga PNODAVL dRotireStanga(PNODAVL rad){//rotire dubla right-left rad->sd = sRotireDreapta(rad->sd); rad = sRotireStanga(rad); return rad;}

9) Afisare element in arbore void arboreAfisareAVL(PNODAVL rad){ if(rad){ cout << rad->informatie; if((rad->ss!=NULL)||(rad->sd!=NULL)){ cout << "("; arboreAfisareAVL(rad->ss); cout << ","; arboreAfisareAVL(rad->sd); cout << ")"; }}else cout << "-";}

10) Cautare element in arbore bool cautaInformatieAVL(PNODAVL rad, int informatie){ bool temp = false; if(!rad) return temp; // else cout << rad->informatie; if(rad->informatie == informatie) temp = true; if(!temp) temp = cautaInformatieAVL(rad->ss, informatie); if(!temp) temp = cautaInformatieAVL(rad->sd, informatie); return temp;} 11) Stergerea elementelor arborelui void stergeArbore(PNOD rad){ if(rad->ss) stergeArbore(rad->ss); if(rad->sd) stergeArbore(rad->sd);

delete rad;}

12) Quicksort crescator void quick(int in,int sf){ int i,j,pivot,aux; if(in>=sf) return ; i=in; j=sf; pivot=v[(i+j)/2]; do { while(v[i]<pivot) i++; while(v[j]>pivot) j--; if(i<=j) { aux=v[i]; v[i++]=v[j]; v[j--]=aux; } } while (i<j); if(in<j) quick(in,j); if(i<sf) quick(i,sf); }

13) Quicksort descrescator void quick(int in,int sf){ int i,j,pivot,aux; if(in>=sf) return ; i=in; j=sf; pivot=v[(i+j)/2];

do { while(v[i]>pivot) i++; while(v[j]<pivot) j--; if(i<=j) { aux=v[i]; v[i++]=v[j]; v[j--]=aux; } } while (i<j); if(in<j) quick(in,j); if(i<sf) quick(i,sf); }

14) Aranjamente de n luate cate k void tipar(int k){ for(int i=0;i<k;i++) cout<<st[i]<<" "; cout<<endl; } int valid(int k) { for(int i=0;i<k;i++) if(st[k]==st[i]) return 0; return 1; } void gen(int k) { if(k == m) tipar(k); else for(int i=1;i<=n;i++) { st[k]=i; if(valid(k)) gen(k+1); } }

15) Permutari de n luate cate k void tipar(int k){ for(int i=1;i<k;i++) cout<<st[i]<<" "; cout<<endl; } int valid(int k) { for(int i=1;i<k;i++) if(st[k]==st[i]) return 0; return 1; }

void gen(int k) { if(k == n+1) tipar(k); else for(int i=1;i<=n;i++) { st[k]=i; if(valid(k)) gen(k+1); } } 16) Combinari de n luate cate k void sub(int poz) { if (poz == N + 1) { int cate = 0; for (int i = 1; i <= N; i ++) if (v[i] == 1) cate ++; if (cate == K){ for (int i = 1; i <= N; i ++) if (v[i] == 1) cout << i << ' '; cout << '\n'; }} else {v[poz] = 0;sub(poz + 1); v[poz] = 1; sub(poz + 1); }}int main() { cin >> N >> K; sub(1); return 0;}

void mergeSort(int inceput, int sfarsit){ //sortare cu interclasare if(inceput >= sfarsit) return; int mijloc = (inceput+sfarsit)/2;

mergeSort(inceput, mijloc); mergeSort(mijloc+1, sfarsit); interclasare(inceput, mijloc, mijloc+1, sfarsit);}

void mergeSort(int inceput, int sfarsit){ //sortare cu interclasare if(inceput >= sfarsit) return; int mijloc = (inceput+sfarsit)/2; mergeSort(inceput, mijloc); mergeSort(mijloc+1, sfarsit); interclasare(inceput, mijloc, mijloc+1, sfarsit);}

You might also like