Copiuta
Copiuta
#include <stdio.h> int n, v[100]; int valid(int k) { int i; for (i = 1; i <= k - 1; i++) if (v[i] == v[k]) {return 0; }
return 1; } int solutie(int k) { if (k == n) {return 1;} return 0;} void afisare(int k) { int i; for (i = 1; i <= k; i++)
{printf("%d ", v[i]);} printf("\n"); } void BK(int k) { int i; for (i = 1; i <= n; i++) {v[k] = i; if (valid(k)) { if
(solutie(k)) afisare(k); else BK(k + 1); } } } void main() { printf("Introduceti n: "); scanf_s("%d", &n); BK(1); }
#include <stdio.h> int n, v[100], p; int valid(int k) { int i; for (i = 1; i <= k - 1; i++) if (v[i] == v[k]) {return 0;}
return 1; } int solutie(int k) { if (k == p) {return 1;} return 0; } void afisare(int k) { int i; for (i = 1; i <= k; i++)
printf("%d ", v[i]); printf("\n"); } void BK(int k) { int i; for (i = 1; i <= n; i++) { v[k] = i; if (valid(k)) { if
(solutie(k)) afisare(k); else BK(k + 1); } } } void main() { printf("Introduceti n: "); scanf_s("%d", &n);
printf("Introduceti p: "); scanf_s("%d", &p); BK(1); }
#include <studio.h> int n, v[100], p; int solutie(int k) { if (k == p) return 1; return 0; } void afisare(int k)
{ int i; for (i = 1; i <= k; i++) printf("%d ", v[i]); printf("\n"); } void BK(int k) { int i; for (i = v[k - 1] + 1; i <= n;
i++) { v[k] = i; if (solutie(k)) afisare(k); else BK(k + 1); } } void main() { printf("Introduceti n: ");
scanf_s("%d", &n); printf("Introduceti p: "); scanf_s("%d", &p); BK(1); }
#include<stdio.h> #include <conio.h> #include <math.h> int st[20], n, k, a[20][20]; void init() { st[k] =
0; } int succesor() { if (st[k] < 4) { st[k]++; return 1; } else return 0; } int valid() { for (int i = 1; i < k; i++) if
(st[i] == st[k] && a[i][k] == 1) return 0; return 1; } int sol() { return (k == n); } void tipar() { for (int i = 1; i <=
n; i++) printf("Tara numarul %d ce are culoarea %d\n", i, st[i]); printf("\n\n"); } void bkt() { int as; k = 1;
init(); while (k > 0) { do {} while ((as = succesor()) && !valid()); if (as) if (sol()) tipar(); else { k++; init(); }
else k--; } } void main() { printf("Dati numarul de tari:"); scanf("%d", &n); printf("Dati matricea:\n"); for
(int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]); bkt(); _getch(); }
Problema celor 8 (n) regine
#include<stdio.h> #include<math.h> int nr, v[100]; int validare(int k) { int i; for (i = 1; i <= k - 1; i++) if (v[i]
== v[k] || abs(v[k] - v[i]) == (k - i)) return 0; return 1; } int solutie(int k) { if (k == nr) return 1; return 0; }
void afisare() { int i, j; for (i = 1; i <= nr; i++) { for (j = 1; j <= nr; j++) if (v[i] == j) printf("D "); else printf("- ");
printf("\n"); } printf("\n --------------------------------------------\n"); } void Backtracking(int k) { int i; for (i = 1; i
<= nr; i++) { v[k] = i; if (validare(k) == 1) if (solutie(k) == 1) afisare(); else Backtracking(k + 1); } } void
main() { printf("Introduceti dimensiunea tablei de sah: "); scanf_s("%d", &nr); Backtracking(1); }
#include<stdio.h> #define MAX 20 int n = 0, x, v[MAX], w[MAX], z[MAX], S, Suma, sol; int valid(int k) { int
i; Suma = 0; for (i = 1; i <= k; i++) Suma = Suma + v[i] * w[i]; if ((Suma <= S) && (k <= n)) return 1; return 0;
} int solutie() { if (Suma == S) return 1; return 0; } void afisare(int k) { int i; sol++; printf("Solutia : %d \n",
sol); for (i = 1; i <= k; i++) if (v[i]) printf("%d monede de valoarea %d \n", v[i], w[i]); printf("\n"); } void
BK(int k) { int i; for (i = 0; i <= z[k]; i++) { v[k] = i; if (valid(k) == 1) { if (solutie() == 1) afisare(k); else BK(k +
1); } } } void citire() { int i; FILE* f; fopen_s(&f, "monede.txt", "r"); if (f == NULL) printf("Fisierul nu exista");
else { fscanf_s(f, "%d", &S); fscanf_s(f, "%d", &n); for (i = 1; i <= n; i++) { fscanf_s(f, "%d", &w[i]); z[i] = S /
w[i]; } } } void main() { citire(); BK(1); }
Problema turelor
#include<stdio.h> int nr, v[100]; int validare(int k) { int i; for (i = 1; i <= k - 1; i++) if (v[i] == v[k]) return 0;
return 1; } int solutie(int k) { if (k == nr) return 1; return 0; } void afisare() { int i, j; for (i = 1; i <= nr; i++)
{ for (j = 1; j <= nr; j++) if (v[i] == j) printf("T "); else printf("- "); printf("\n"); } printf("\n
--------------------------------------------\n"); } void Backtracking(int k) { int i; for (i = 1; i <= nr; i++) { v[k] = i; if
(validare(k) == 1) if (solutie(k) == 1) afisare(); else Backtracking(k + 1); } } void main() { printf("Introduceti
dimensiunea tablei de sah: "); scanf_s("%d", &nr); Backtracking(1); }
#include<conio.h> #include<stdio.h> char sp[] = " "; int x[20], n, nrsol = 0; void Afisare() { int i; printf("%c
{", sp); for (i = 1; i <= n; i++) if (x[i] == 1) printf("%d ", i); printf(" }\n"); nrsol++; } void BackRec(int k) { int i;
for (i = 0; i <= 1; i++) { x[k] = i; if (k == n) Afisare(); else BackRec(k + 1); } } int main() { printf("\n\
nSubmultimile multimii {1,2,3.....,n}\n "); printf(" Dati valoarea unui n:"); scanf("%d", &n); printf("\n");
BackRec(1); printf("Nr. solutii: %d\n", nrsol); _getch(); return 0; }
Parcuregre in latime
//graf neponderat
//graf ponderat
#include <stdio.h> #include<malloc.h> int citire_graf(char numefisier[20], int* nr_vrf, int* nr_muchii,
int*** g) { FILE* f; int i,er; fopen_s(&f, numefisier, "r+t"); if (f == NULL) er = 1; else { er = 0; fscanf_s(f,"%d
%d", nr_vrf, nr_muchii); *g = (int**)malloc(*nr_muchii* sizeof(int*)); for (i = 0; i < *nr_muchii; i++) (*g)[i]
= (int*)malloc(3 * sizeof(int)); for (i = 0; i < *nr_muchii; i++) fscanf_s(f,"%d %d %d", & (*g)[i][0], & (*g)[i]
[1], &(*g)[i][2]); fclose(f); } return er; } void main() { char numefisier[20]; int n, m, ** tabel, er;
printf("Introduecti fisierul din care cititi graful:"); gets_s(numefisier); er = citire_graf(numefisier, &n, &m,
&tabel); printf("Numarul de varfuri este:%d", n); printf("Numarul de muchii este:%d", m);
printf("Muchiile sunt:\n"); int i; for (i = 0; i < m; i++) { printf("%d %d ", tabel[i][0], tabel[i][1]);
printf("Ponderea muchiei este: %d\n", tabel[i][2]); } }
//graf neponderat
#include<stdio.h> #include<malloc.h> int citire_graf(char numefisier[20], int* nr_vrf, int* nr_muchii,
int*** g) { FILE* f; int i, er; fopen_s(&f, numefisier, "r+t"); if (f == NULL) er = 1; else { er = 0; fscanf_s(f,
"%d %d", nr_vrf, nr_muchii); *g = (int**)malloc(*nr_muchii * sizeof(int*)); for (i = 0; i < *nr_muchii; i++)
(*g)[i] = (int*)malloc(2 * sizeof(int)); for (i = 0; i < *nr_muchii; i++) fscanf_s(f, "%d %d", &(*g)[i][0], &(*g)
[i][1]); fclose(f); } return er; } int** conversie_matrice(int nr_vrf, int nr_muchii, int** tabel, int* dim) { int
i, j; int** mat; *dim = nr_vrf; mat = (int**)malloc(*dim * sizeof(int*)); for (i = 0; i < *dim; i++) mat[i] =
(int*)malloc(*dim * sizeof(int*)); for (i = 0; i < *dim; i++) { for (j = 0; j < *dim; j++) mat[i][j] = 0; } for (i = 0;
i < nr_muchii; i++) { mat[tabel[i][0] - 1][tabel[i][1] - 1] = 1; mat[tabel[i][1] - 1][tabel[i][0] - 1] = 1; } return
mat; } void main() { char numefisier[20]; int n, m, ** tabel, er; printf("Introduecti fisierul din care cititi
graful:"); gets_s(numefisier); er = citire_graf(numefisier, &n, &m, &tabel); printf("Numarul de varfuri
este:%d", n); printf("Numarul de muchii este:%d", m); printf("Muchiile sunt:\n"); int i,j; for (i = 0; i < m; i+
+) printf("%d %d\n", tabel[i][0], tabel[i][1]); int** a, dim; a = conversie_matrice(n, m, tabel, &dim);
printf("\nMatricea de adiacenta este:\n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) printf("%d ", a[i]
[j]); printf("\n"); } }
//graf ponderat
#include #include #define INF 1000 int citire_graf(char numefisier[20], int* nr_vrf, int* nr_muchii, int***
g) { FILE* f; int i, er; fopen_s(&f, numefisier, "r+t"); if (f == NULL) er = 1; else { er = 0; fscanf_s(f, "%d %d",
nr_vrf, nr_muchii); *g = (int**)malloc(*nr_muchii * sizeof(int*)); for (i = 0; i < *nr_muchii; i++) (*g)[i] =
(int*)malloc(3 * sizeof(int)); for (i = 0; i < *nr_muchii; i++) fscanf_s(f, "%d %d %d", &(*g)[i][0], &(*g)[i][1],
&(*g)[i][2]); fclose(f); } return er; } int** conversie_matrice(int nr_vrf, int nr_muchii, int** tabel, int*
dim) { int i, j; int** mat; *dim = nr_vrf; mat = (int**)malloc(*dim * sizeof(int*)); for (i = 0; i < *dim; i++)
mat[i] = (int*)malloc(*dim * sizeof(int*)); for (i = 0; i < *dim; i++) { for (j = 0; j < *dim; j++) mat[i][j] =
INF; } for (i = 0; i < nr_muchii; i++) { mat[tabel[i][0] - 1][tabel[i][1] - 1] = tabel[i][2]; mat[tabel[i][1] - 1]
[tabel[i][0] - 1] = tabel[i][2]; } return mat; } void main() { char numefisier[20]; int n, m, ** tabel, er;
printf("Introduecti fisierul din care cititi graful:"); gets_s(numefisier); er = citire_graf(numefisier, &n, &m,
&tabel); printf("Numarul de varfuri este:%d", n); printf("Numarul de muchii este:%d", m);
printf("Muchiile sunt:\n"); int i,j; for (i = 0; i < m; i++) { printf("%d %d ", tabel[i][0], tabel[i][1]);
printf("Ponderea muchiei este: %d\n", tabel[i][2]); } int** a, dim; a = conversie_matrice(n, m, tabel,
&dim); printf("\nMatricea de adiacenta este:\n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++)
printf("%d ", a[i][j]); printf("\n"); } }
#include<stdio.h> #include<conio.h> void citire(int a[][30], int* n, int* m) { FILE* f; int u, v, i; char
Numefis[40]; printf_s("numele fisierului: "); gets_s(Numefis); fopen_s(&f, Numefis, "r"); if (f == NULL)
printf_s("\n Nu se poate deschide!"); else { fscanf_s(f, "%d %d", n, m); for (i = 1; i <= *m; i++) { fscanf_s(f,
"%d", &u); fscanf_s(f, "%d", &v); a[u][v] = a[v][u] = 1; } fclose(f); } } int verificare(int a[][30], int n) { int i,
ok, j; ok = 1; for (i = 0; i < n; i++) for (j = 1; j < n; j++) if (a[i][j] == 1) ok = 0; if (ok == 1) return 1; else return
0; } void main() { int a[30][30], n, m, rez; citire(a, &n, &m); rez = verificare(a, n); if (rez == 0) printf_s("\
nExista varfuri care nu sunt izolate"); else printf_s("\nToate varfurile sunt varfuri izolate"); _getch(); }
#include<stdio.h> #include<conio.h> void citire(int a[][30], int* n, int* m) { int x, y, i; FILE* f; char
Numefis[30]; printf_s("\nIntroduceti fisierul: "); gets_s(Numefis); fopen_s(&f, Numefis, "r"); if (f == NULL)
printf_s("\nNu se poate deschide!"); else { fscanf_s(f, "%d %d", n, m); for (i = 1; i <= *m; i++) { fscanf_s(f,
"%d", &x); fscanf_s(f, "%d", &y); a[x][y] = a[y][x] = 1; } fclose(f); } } int verifica(int a[][30], int n) { int i, j,
ok; ok = 1; //pp ca e complet for (i = 0; i < n; i++) for (j = 0; j < n; j++) if ((i != j) && a[i][j] != 1) ok = 0;
//presupunere falsa if (ok == 1) return 1; //graf complet else return 0; //graful nu e complet } void main()
{ int a[30][30], n, m, rez; citire(a, &n, &m); rez = verifica(a, n); if (rez == 1) printf("\nGraf complet"); else
printf("\nGraful nu e complet"); _getch(); }
Prim
#define _CRT_SECURE_NO_WARNINGS #include #include #include float Prim(float** w, int n, int v0,
int*** arb, float MAX) { float cost, cmin; int i, u, v, vf1, vf2; cost = 0; int* ind = (int*)malloc(n *
sizeof(int)); for (i = 0; i < n; i++) ind[i] = 0; ind[v0 - 1] = 1; //ind este vectorul indicator: //ind[i]=1 daca
virful i+1 a fost trecut in A, altfel este 0 int** muchii = (int**)malloc((n - 1) * sizeof(int*)); for (i = 0; i < n -
1; i++) muchii[i] = (int*)malloc(2 * sizeof(int)); for (i = 0; i < n - 1; i++) { cmin = MAX; for (u = 1; u <= n; u+
+) if (ind[u - 1]) for (v = 1; v <= n; v++) if ((!ind[v - 1]) && (w[u - 1][v - 1] <= cmin)) { vf1 = u; vf2 = v; cmin =
w[u - 1][v - 1]; } cost += cmin; muchii[i][0] = vf1; muchii[i][1] = vf2; ind[vf2 - 1] = 1; } *arb = muchii;
free(ind); return cost; } void main() { int i, j, nv, nm, v, u, v0, ** arb; float** w, MAX = 1000000, cost, p;
printf("Numarul de virfuri:"); scanf("%i", &nv); printf("Numarul de muchii:"); scanf("%i", &nm); w =
(float**)malloc((nv) * sizeof(float*)); for (i = 0; i < nv; i++) w[i] = (float*)malloc(nv * sizeof(float));
printf("Matricea ponderilor\n"); for (i = 0; i < nv; i++) for (j = 0; j < nv; j++) w[i][j] = MAX; for (i = 0; i < nm;
i++) { printf("Muchia %i si ponderea:", i + 1); scanf("%i %i %f", &v, &u, &p); w[u - 1][v - 1] = w[v - 1][u - 1]
= p; } printf("Introduceti varful de pornire:"); scanf("%i", &v0); cost = Prim(w, nv, v0, &arb, MAX); printf("\
nArborele partial de cost minim este:\n"); for (i = 0; i < nv - 1; i++) printf("%i -> %i\n", arb[i][0], arb[i][1]);
printf(" cu costul %4.2f\n", cost); }
//cu preluare graf din fisier text
#include<stdio.h> #include<conio.h> #pragma warning (disable:4996) int Prim(int w[100][100], int n, int
vf, int rez[100][2], int max) { int cost, cmin, i, u, v, v1, v2, viz[100]; cost = 0; for (i = 0; i < n; i++) viz[i] = 0;
viz[vf - 1] = 1; for (i = 0; i < n - 1; i++) { cmin = max; for (u = 1; u <= n; u++) if (viz[u - 1]) for (v = 1; v <= n;
v++) if (!viz[v - 1] && w[u - 1][v - 1] <= cmin) { v1 = u; v2 = v; cmin = w[u - 1][v - 1]; } cost = cost + cmin;
rez[i][0] = v1; rez[i][1] = v2; viz[v2 - 1] = 1; } return cost; } void main() { int w[100][100], rez[100][2], n, m,
x, y, c, cost, vf, i, j; FILE* f; f = fopen("input.txt", "r"); if (!f) printf("Eroare la deschiderea fisierului de
date."); else { fscanf(f, "%d", &n); fscanf(f, "%d", &m); for (i = 0; i < n; i++) for (j = 0; j < n; j++) w[i][j] =
32000; for (i = 0; i < m; i++) { fscanf(f, "%d", &x); fscanf(f, "%d", &y); fscanf(f, "%d", &c); w[x - 1][y - 1] =
w[y - 1][x - 1] = c; } fclose(f); } printf("Varful de start: "); scanf("%d", &vf); cost = Prim(w, n, vf, rez, 32000);
printf("Un arbore de cost minim contine muchiile: "); for (i = 0; i < n - 1; i++) printf("\nMuchia %d - %d",
rez[i][0], rez[i][1]); printf("\nCost total: %d", cost); _getch(); }
int inserare_nod_in_stiva(int* stiva, int n, int vf) { int i; for (i = n - 1; i >= 0; i--) stiva[i + 1] = stiva[i];
stiva[0] = vf; n++; return n; } int stergere_nod_din_stiva(int* stiva, int n) { int i; for (i = 0; i < n - 1; i++)
stiva[i] = stiva[i + 1]; n--; return n; } int citeste_stiva(int* stiva, int n) { return stiva[0]; } void
parcurgere_in_adancime(int v0, int** a, int n) { int* stiva, * m, i, nr_c, gasit; stiva = (int*)malloc(n *
sizeof(int)); m = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; m[i++] = 0); nr_c = 0; nr_c =
inserare_nod_in_stiva(stiva, nr_c, v0); m[v0] = 1; printf("\n%i", v0 + 1); while (nr_c) { i =
citeste_stiva(stiva, nr_c); gasit = 0; for (int k = 0; (k < n) && !gasit; k++) if ((a[i][k] == 1) && (m[k] == 0))
{ nr_c = inserare_nod_in_stiva(stiva, nr_c, k); m[k] = 1; printf("\n%i", k + 1); gasit = 1; } if (!gasit) nr_c =
stergere_nod_din_stiva(stiva, nr_c); }free(stiva); free(m); } void main() { int n, v0, ** a, m, i, j, vf1, vf2;;
printf("Introduceti numarul de varfuri:"); scanf("%d", &n); a = (int**)malloc(n * sizeof(int*)); for (i = 0; i <
n; i++) a[i] = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) for (j = 0; j <= i; j++) a[j][i] = a[i][j] = 0;
printf("\Introduceti numarul de muchii:"); scanf("%d", &m); for (i = 0; i < m; i++) { printf("Introduceti nod
initial pentru muchie"); scanf("%d", &vf1); printf("Introduceti nod final pentru muchie:"); scanf("%d",
&vf2); a[vf1 - 1][vf2 - 1] = a[vf2 - 1][vf1 - 1] = 1; } printf("\nIntroduceti nodul initial pentru parcurgerea DF
"); scanf("%i", &v0); printf("\nOrdinea de vizitare a varfurilor grafului este:");
parcurgere_in_adancime(v0 - 1, a, n); for (i = 0; i < n; i++) free(a[i]); free(a); }
for (j = 0; j < n; j++) m[i][j] = a[i][j]; for (j = 0; j < n; j++) for (i = 0; i < n; i++) if (m[i][j] != 0) for (k = 0; k < n;
k++) if (m[i][k] < m[k][j]) m[i][k] = m[k][j]; } int verificare_conexitate(int m[10][10], int n) { int i, j; for (i =
0; i < n; i++) for (j = 0; j < n; j++) if (m[i][j] == 0) return 0; return 1; } void main() { int a[10][10], n, nm, i, j,
u, v, m[10][10]; printf("Introduceti numarul de noduri:"); scanf_s("%d", &n); printf("Introduceti numarul
de muchii:"); scanf_s("%d", &nm); for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j] = 0; for (i = 0; i < nm; i++)
{ printf("Introduceti nod initial muchie:"); scanf_s("%d", &u); printf("Introduceti nod final muchie:");
scanf_s("%d", &v); a[u - 1][v - 1] = a[v - 1][u - 1] = 1; } Roy_Warshall(a, m, n); printf("Matricea existentei
drumurilor este:\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf("%d ", m[i][j]); printf("\n"); } int
conex = verificare_conexitate(m, n); if (conex == 1) printf("\nGraful este conex"); else printf("\nGraful nu
este conex");}
Kruskal
//preluare graf din fisier
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <conio.h> int radacina(int v, int
tata[50]) { int u = v; while (tata[u] >= 0) u = tata[u]; return u; } int kruskal(int a[100][3], int n) { int
tata[50], i, j, k, p, c = 0; for (i = 0; i < n; i++) tata[i] = -1; for (j = i = 0; i < n - 1; j++) { k = radacina(a[j][1],
tata); p = radacina(a[j][0], tata); if (k - p) { if (tata[k] < tata[p]) { tata[k] = tata[k] + tata[p]; tata[p] = k; } else
{ tata[p] = tata[p] + tata[k]; tata[k] = p; } c = c + a[j][2]; printf("\nMuchia %d - %d, cost %d", a[j][0], a[j][1],
a[j][2]); i++; } } return c; } void main() { int a[100][3], n, m, cost, i, j, x, y, c, aux; FILE* f; f =
fopen("input.txt", "r"); if (!f) printf("Eroare la deschiderea fisierului de date."); else { fscanf(f, "%d", &n);
fscanf(f, "%d", &m); for (i = 0; i < m; i++) {fscanf(f, "%d", &x); fscanf(f, "%d", &y); fscanf(f, "%d", &c); a[i]
[0] = x; a[i][1] = y; a[i][2] = c; } fclose(f); } for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (a[i][2] > a[j][2])
{ aux = a[i][0]; a[i][0] = a[j][0]; a[j][0] = aux; aux = a[i][1]; a[i][1] = a[j][1]; a[j][1] = aux; aux = a[i][2]; a[i][2]
= a[j][2]; a[j][2] = aux; } printf("Arborele de cost minim contine muchiile: "); cost = kruskal(a, n); printf("\
nCost total: %d", cost); _getch(); }