Sunteți pe pagina 1din 11

1.Drapel //a. Colorarea unui drapel cu n benzi fiecare banda putind avea h culori #include <stdio.

h> int posibil(int); void afis_sol(void); int x[5],n; void main(void) { int k,h; printf("\nIntrodu numarul de culori ale unui drapel(benzi, <=5)\n"); scanf("%d",&n); printf("Introdu numarul maxim de culori posibile ale unei benzi \n"); scanf("%d",&h); k=0; x[k]=0; do { while(x[k] < h) //mai sunt valori posibile pentru componenta k { x[k]++; //trec la urmatoarea valoare if(posibil(k)) if(k==(n-1)) afis_sol(); //e gata solutie else {k++;x[k]=0;} //trec la urmatoarea //componenta cu valori de la zero }//while k--; //nu mai sunt valori pentru componenta k. Revin la componenta k-1 }while(!(k<0));//m-am intors mai mult decit se putea, sau k>=0 }//main int posibil(int k) { if(k==0)return 1;//initial este posibil tot if(x[k-1]==x[k])return 0;//am doua culori alaturate ce nu e posibil return 1;//nu sunt culori alaturate }//posibil void afis_sol(void) { for(int i=0;i<n;i++) //afisez solutia curenta pentru componentele drapelului printf("%d ",x[i]); printf("\n"); }//afis_sol

//b. Colorarea unui drapel cu n benzi fiecare banda putind avea h culori-recursiv #include <stdio.h> int posibil(int); void afis_sol(void); void dr_rec(int k); int x[5],n; int h; void main(void) { printf("\nIntrodu numarul de culori ale unui drapel(benzi, <=5)\n"); scanf("%d",&n); printf("Introdu numarul maxim de culori posibile ale unei benzi \n"); scanf("%d",&h); dr_rec(0); }//main int posibil(int k) { if(k==0)return 1;//initial este posibil tot if(x[k-1]==x[k])return 0;//am doua culori alaturate ce nu e posibil return 1;//nu sunt culori alaturate }//posibil void afis_sol(void) { for(int i=0;i<n;i++) //afisez solutia curenta pentru componentele drapelului printf("%d ",x[i]); printf("\n"); }//afis_sol void dr_rec(int k) { for(int i=1;i<=h;i++) { x[k]=i; if(posibil(k)) if(k==(n-1)) afis_sol(); //e gata solutie else dr_rec(k+1); //trec la urmatoarea componenta } }//dr_rec

2.//Descompunerea unui numar n, citit, in suma de numere naturale //Backtracking cu solutii avind un numar variabil de componente #include <stdio.h> int posibil(int,int&); void afis_sol(int); int x[20],n; void main(void) { int k,sum;//sum se transmite la o referinta avind acces la suma returnata printf("\nIntrodu numarul care urmeaza sa fie descompus( <=20)\n"); scanf("%d",&n); k=0; x[k]=0; do { while(x[k] < n) { x[k]++; if(posibil(k, sum)) if(sum==n) afis_sol(k); else {k++;x[k]=0;} }//while k--; }while(!(k<0)); }//main int posibil(int k,int &s) { s=0; if(k==0)return 1; //initial e posibil ori ce //sa am valori crescatoare doar if(x[k]>=x[k-1]){for( int i=0;i<=k;i++)s+=x[i];//calculez suma if(s<=n)return 1; } return 0; }//posibil void afis_sol(int k) { for(int i=0;i<=k;i++) printf("%d ",x[i]); printf(" \n"); }//afis_sol

3. Voiajor nerecursiv- trafic de pachete, rutare Bellman-Ford (Dijkstra) //n orase cu legaturi in matr. Costuri (val!=0) leg. directa altfel ocol. Pornind din orasul i //se determina ruta voiajorului prin toate orasele si inapoi cu cost minim #include <stdio.h> #include <conio.h> #define MAX 7 int x[MAX],Y[MAX];//x componentele solutiei, rezultatul Y int COST[MAX][MAX];//mat. costuri void cit(int [][MAX],int &);// citire matrice void afis(int [][MAX],int &);//afisare matrice int max_cost(int [][MAX],int &);//det. Cost maxim void afis_sol(long &);//afisare solutie optima int posibil(int);//posibil solutie- sa existe drum direct intre orase si oras neales in prealabil int n; void main(void){ int k; long cost_M,C; printf("Introdu dim matrice costuri(nr.orase) <=7\n"); scanf("%d",&n); printf("Introdu si afis matricea costurilor C\n"); cit(COST,n); afis(COST,n); cost_M=(n+1)*(long)max_cost(COST,n)+1;//stabilire un cost maxim initial // printf("Cost maxim= %ld\n",cost_M); k=0;//prima componenta printf("Introdu orasul initial (0 ~ n-1)"); scanf("%d",&x[k]); k=1;//urmatoarea componenta x[k]=-1;//valori posibile de la 0 si de aceea prima val. sub cea posibila do { while(x[k] < n) //mai sunt valori posibile pentru componenta k { x[k]++; //trec la urmatoarea valoare if(posibil(k)) if((k==(n-1))&& (COST[x[n-1]][x[0]]!=0)){ //adica a ajuns pana la orasul n-1 si se poate intoarce de unde a plecat C=0;//determin noul cost for(int i=0;i<n-1;i++)C+=COST[x[i]][x[i+1]]; C+=COST[x[n-1]][x[0]];//cost total inclusiv revenire if(C<cost_M)for(int i=0;i<n;i++){Y[i]=x[i]; cost_M=C;} //salvare solutie noua obtinuta, modificare cost_M } else {k++;x[k]=-1;} //trec la urmatoarea componenta }//while

k--; //nu mai sunt valori pentru componenta k. Revin la componenta k-1 }while(!(k<1));//m-am intors mai mult decit se putea sau k>=1 afis_sol(cost_M); //e gata solutie }//main int posibil(int k) { if(k==0)return 1; if(COST[x[k-1]][x[k]]!=0){//adica drum direct for(int i=0;i<k;i++) if(x[k]==x[i])return 0;//orasul sa nu fi fost deja ales return 1; } return 0; }//posibil void afis_sol(long &CF) { for(int i=0;i<n;i++) //afisez solutia curenta pentru componentele drapelului printf("%d ",Y[i]); printf("\nCostul este %ld",CF); }//afis_sol void cit(int mat[][MAX],int &n){ for(int i=0;i<n-1;i++) { mat[i][i]=0; for(int j=i+1;j<n;j++) { printf("Introdu Elem[%d][%d]= ",i,j); scanf("%d",&mat[i][j]); mat[j][i]=mat[i][j]; } } }//cit void afis(int mat[][MAX], int &n) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%4d ",mat[i][j]); printf("\n"); } }//afis

int max_cost(int mat[][MAX],int &n) { int max=mat[0][0]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(mat[i][j] > max)max=mat[i][j]; return max; }//max_cost

4. Voiajor- Varianta recursiva #include <stdio.h> #include <conio.h> #define MAX 7 void gene(int k);//metoda recursiva int x[MAX],Y[MAX];//x componentele solutiei, rezultatul Y int COST[MAX][MAX]; void cit(int [][MAX],int &); void afis(int [][MAX],int &); int max_cost(int [][MAX],int &); void afis_sol(long &); int posibil(int); int n; long cost_M,C; void main(void) { int k; printf("Introdu dim matrice costuri(nr.orase) <=7\n"); scanf("%d",&n); printf("Introdu si afis matricea costurilor C\n"); cit(COST,n); afis(COST,n); cost_M=(n+1)*(long)max_cost(COST,n)+1; // printf("Cost maxim= %ld\n",cost_M); k=0; printf("Introdu orasul initial (0 ~ n-1)"); scanf("%d",&x[k]); gene(1); afis_sol(cost_M); //e gata solutie }//main int posibil(int k) { if(k==0)return 1; if(COST[x[k-1]][x[k]]!=0){ for(int i=0;i<k;i++) if(x[k]==x[i])return 0; return 1; } return 0; }//posibil void afis_sol(long &CF) {

for(int i=0;i<n;i++) //afisez solutia curenta printf("%d ",Y[i]); printf("\nCostul este %ld",CF); }//afis_sol void cit(int mat[][MAX],int &n) { for(int i=0;i<n-1;i++) { mat[i][i]=0; for(int j=i+1;j<n;j++) { printf("Introdu Elem[%d][%d]= ",i,j); scanf("%d",&mat[i][j]); mat[j][i]=mat[i][j]; } } }//cit void afis(int mat[][MAX], int &n) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%4d ",mat[i][j]); printf("\n"); } }//afis int max_cost(int mat[][MAX],int &n) { int max=mat[0][0]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(mat[i][j] > max)max=mat[i][j]; return max; }//max_cost void gene(int k) { for(int i=0;i<n;i++)// valori intre 0 si n-1 { x[k]=i; if(posibil(k)) if((k==(n-1))&& (COST[x[n-1]][x[0]]!=0)){ C=0;// stabilire cost pentru solutia determinata for(int i=0;i<n-1;i++)C+=COST[x[i]][x[i+1]]; C+=COST[x[n-1]][x[0]];

if(C<cost_M)for(int i=0;i<n;i++){Y[i]=x[i]; cost_M=C;} //salvare solutie cost minim } else gene(k+1); } } // end gene

5. Generare componente considerand diferite ponderi //genereaza niste note partiale pornind de la o nota finala #include <stdio.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #define NRNOTE 3 using namespace std; void afis_sol(void); int x[NRNOTE],n=1,cont; float p1,p2,p3; int nmin=4, nmax=10; void main(void) { int k; float p; cout << "\nIntrodu cele 3 ponderi \nPrima pondere : "; cin >>p1; cout << "\nA doua pondere : "; cin >>p2; cout << "\nA treia pondere : "; cin >>p3; p=p1+p2+p3; if(p != 1.0){cout <<"\nPonderi gresite";exit(0);} ; cout <<"\nIntrodu notele finale (0-10). Nota = 0 te scoate din ciclu"; while(n!=0) { cout << "\n Nota : "; cin >> n; if (n <=nmax) { cont=0; k=0; x[k]=0; do { while(x[k]<nmax) { x[k]=x[k]+1; if(x[k] > nmin-1) if(k==(NRNOTE-1))afis_sol(); else {k++; x[k]=0;} } k--; }while(!(k<0)); }

else cout <<"\nNota invalida"; } }//main void afis_sol(void) { int l; double fraction, integer; double number; number=(double)(p1*x[0] + p2*x[1] + p3*x[2]); fraction = modf(number, &integer); if (fraction >=.5) number=number+1; l=(int)number; if (l==n) { printf("\n N1 = %d N2 = %d N3 = %d",x[0], x[1], x[2]); cont++; if(cont >20){ cont=0; cout <<"\nIntrodu un caracter pentru continuare"; getch(); } } }//afis_sol

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