Advertisement
Alx09

Ex 15 Sebi

May 8th, 2020
1,743
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. int v[6], n, m; // avem nevoie de ce-l mult 5 elemte in stiva
  6. FILE *g; // variabila de tip Fiser
  7.  
  8. void Init(int k) {
  9.     v[k] = 0; // initiailzm elemtenul cu 0
  10. }
  11. int Succesor(int k) {
  12.     if (v[k] < n) { // verificam daca mai avem succsoer si daca este incrementam
  13.         v[k]++;
  14.         return 1;
  15.     }
  16.     return 0;
  17. }
  18.  
  19.  
  20. int Solution(int k) {
  21.     return (k == m / 2); // ne trebuie doar m / 2 elemente pe restul le vom gnera pe baza acestora
  22. }
  23.  
  24. void Print() {
  25.     int i, j;
  26.     if (m % 2)  // daca m este impar
  27.         for (j = 1; j <= n; j++) { // afisam elementele din stiva de n ori cu valori de din intervaul [1,n]
  28.             for (i = 1; i <= m / 2; i++) //afisam elementee din stiva
  29.                 fprintf(g, "%d ", v[i]);
  30.             fprintf(g, "%d ", j); // afisam a x valoare din milojc deoarece orice cmbinate care are numar impar de cifre admite n soluti de acesi forma
  31.             for (i = m / 2; i >= 1; i--) // afisem elementele din vector in ordine inversa si asa ceam palindrom pentru m impar
  32.                 fprintf(g, "%d ", v[i]);
  33.             fprintf(g, "\n"); // lasam un rand nou
  34.         }
  35.        
  36.    
  37.     else {  // daca m ese par atunci afisam
  38.         for (i = 1; i <= m / 2; i++) // elemntele generate din stiva
  39.             fprintf(g, "%d ", v[i]);
  40.         for (i = m / 2; i >= 1; i--) // elemntele generate in ordine inversa
  41.             fprintf(g, "%d ", v[i]);
  42.     }
  43.     fprintf(g, "\n"); // rand nou
  44. }
  45.  
  46. void Back() { // forma de back pentru generarea tuturor solutilor
  47.     int k = 1;
  48.     Init(k);
  49.     while (k > 0) {
  50.         if (k <= m / 2)
  51.             if (Succesor(k))// daca exista  succesor
  52.  
  53.                 if (Solution(k)) // vedem daca este soltuie
  54.                     Print();
  55.                 else {
  56.                     k++; // incrementam k
  57.                     Init(k); // initializam nou merbu din stiva
  58.                 }
  59.                 else k--; // altfel decrementam k
  60.     }
  61. }
  62.  
  63. int main() {
  64.     FILE *f; // variabila de tip fiser
  65.     f = fopen("in.txt", "r");// deschidem pe f in mod citire
  66.     fscanf(f, "%d%d", &n, &m); // citim n si m din fiser
  67.     g = fopen("out.txt", "w"); // deschidem pe g in mod scriere
  68.     fclose(f); // nu ne mai trebuie f i-l inchdem
  69.     Back(); // apelam functia de back
  70.     fclose(g);// inchidem si pe g
  71.     system("pause");
  72.     return 0;
  73.  
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement