Sunteți pe pagina 1din 10

1.

Drapel

//a. Colorarea unui drapel cu n benzi fiecare banda putind avea h culori
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#define DIM 5

int posibil(int);
void afis_sol(void);

int x[DIM], n;

void main(void)
{
int k, h;
printf("\nIntrodu numarul de culori ale unui drapel(benzi, <DIM=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
_getch();
}//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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#define DIM 5

int posibil(int);
void afis_sol(void);
void dr_rec(int k);
int x[DIM], n;
int h;

void main(void)
{

printf("\nIntrodu numarul de culori ale unui drapel(benzi, <DIM=5)\n");


scanf("%d", &n);
printf("Introdu numarul maxim de culori posibile ale unei benzi \n");
scanf("%d", &h);
dr_rec(0);
_getch();
}//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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#define DIM 20

int posibil(int, int&);


void afis_sol(int);

int x[DIM], 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( <DIM=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));
_getch();
}//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. a. 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
#define _CRT_SECURE_NO_WARNINGS
#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
_getch();
}//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
3. b. Voiajor- Varianta recursiva
#define _CRT_SECURE_NO_WARNINGS
#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
_getch();
}//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
4. Generare componente considerand diferite ponderi

//genereaza niste note partiale pornind de la o nota finala


#include <iostream>
#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) integer++;
//if (fraction >=.5) number=number+1;
// l=(int)number;
l = integer;
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