Alx09

Ex 24 foarte bun

May 13th, 2020
1,456
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*O bară are lungimea L (1<=L<=1000). Se consideră N (1<=N<=10) repere de lungimi diferite.
  5. Să se genereze toate posibilităţile de a tăia bara după reperele existente, fără să rămână rest la
  6. tăiere, fiecare reper fiind folosit cel puţin o dată. Se citesc dintr-un fişier text, de pe primul rând,
  7. lungimea barei – L şi numărul de repere – n, iar de pe următorul rând, reperele. Numerele de pe un
  8. rând sunt separate prin spaţiu
  9. */
  10.  
  11. //Ca arma principala, am folosit stiva.
  12. int main() {
  13.     unsigned short L, n, c, i, varf, *stiva[1001];
  14.     unsigned short repere[11];
  15.  
  16.     FILE* f;
  17.  
  18.     f = fopen("in.txt", "r");
  19.  
  20.     fscanf(f, "%hu%hu", &L, &n);
  21.     //Citirea din fisier a reperelor.
  22.     for (i = 1; i <= n; i++) {
  23.         fscanf(f, "%hu", &repere[i]);
  24.         L -= repere[i];
  25.    
  26.     }
  27.     fclose(f);
  28.  
  29.     //Sortarea in ordine crescatoare a reperelor (bubble sort).
  30.     do {
  31.         c = 0;
  32.         for (i = 1; i <= n; i++)
  33.             if (repere[i] > repere[i + 1])
  34.             {
  35.                 c = 1;
  36.                 repere[i] ^= repere[i + 1];
  37.                 repere[i + 1] ^= repere[i];
  38.                 repere[i] ^= repere[i + 1];
  39.             }
  40.     } while (c);
  41.     c = repere[1];
  42.     varf = 1;
  43.     stiva[0] = repere + varf;
  44.     stiva[varf] = repere + varf;
  45.     f = fopen("out.txt", "w");
  46.  
  47.     //Acest while se opreste daca stiva este goala.
  48.     while (varf) {
  49.         //Daca suma este mai mica, adaugam adresa varfului la varful urmator si adunam la suma.
  50.         if (c < L)
  51.         {
  52.             stiva[varf + 1] = stiva[varf];
  53.             c += *stiva[varf++];
  54.         }
  55.         else
  56.         {
  57.             //Daca c = l, afisam.
  58.             if (c == L)
  59.             {
  60.                 for (i = 1; i <= n; i++)
  61.                     fprintf(f, "%hu ", repere[i]);
  62.                 for (i = 1; i <= varf; i++)
  63.                     fprintf(f, "%hu ", *stiva[i]);
  64.                 fprintf(f, "\n");
  65.             }
  66.             c -= *stiva[varf--];
  67.             c -= *stiva[varf];
  68.             stiva[varf]++;
  69.             c += *stiva[varf];
  70.         }
  71.  
  72.     }
  73.     fclose(f);
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment