Alx09

13.6

Jun 5th, 2022 (edited)
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*
  4.  Am eliminat posibilitatile de genul 1 2 1 , 2 1 1, 1 1 2
  5.  E bazat pe un vector de pointer
  6.  Am sortat reperele si dupa am lucrat cu ajutoul vectroului de pointeri
  7.  Am optimizat memoria mult, si numarul de cazuri posibile l-am redus
  8.  Sper ca e bine ca am eliminat cazurile de la inceput.
  9. */
  10.  
  11.  
  12.  
  13. int main() {
  14.     unsigned short L, suma, i, varf, stiva[1001], nrFel = 0; // Lungigime numar de repre varf deoarece utilizam principi din stiva, si un vector de pointeri
  15.    
  16.     FILE *f; // variabila de tip fiser
  17.  
  18.     scanf("%hu", &L); // citim lungimea si numarul de repere
  19.     fclose(f);// inchidem fiserul
  20.    
  21.     // Se pot aloca vectori de pointer dinamic? pentru ca avem nevoie de o stiva de L/repere[1] + 2 si sa nu fac risipa
  22.     suma = 1;// initializari
  23.     varf = 1;
  24.     stiva[0] = 0; // sa nu am eroare cand varf = 0
  25.     stiva[varf] = 1;// initializari
  26.     f = fopen("out.txt", "w");
  27.     while (varf) { // se opreste cand stiva este goala
  28.         if (suma < L && stiva[varf] < 101) {// daca suma este mai mica adaugam adresa varfului la varf urmator si adunam la suma
  29.             stiva[varf + 1] = stiva[varf] + 1;
  30.             suma += stiva[++varf];
  31.         }// adauagm adresa elementului curent pana suma este >= L
  32.         else { // altfel
  33.             if (suma == L) { // daca suma = L si functia de valid returneaza 1 se afiseaza
  34.                 for (i = 1; i <= varf; i++)
  35.                     fprintf(f, "%hu ", stiva[i]);// afisam elementele de la adresele indicate de st
  36.                 fprintf(f, "\n");
  37.                 nrFel++;
  38.             }
  39.             suma -= stiva[varf--]; // scadem din suma actual varf dupa care scadem varful
  40.             suma -= stiva[varf]; //scadem din suma noul varf
  41.             stiva[varf]++; //se incrementeaza valoarea din varf
  42.             suma += stiva[varf]; // se adaauga noua valaore
  43.         }
  44.  
  45.     }
  46.     fclose(f);
  47.     printf("Se pot aranja in %d feluri", nrFel);
  48.     scanf("%*c");
  49.     return 0;
  50. }
Add Comment
Please, Sign In to add comment