Cod sursa(job #2926750)

Utilizator Codrut198Codrut Dinca Codrut198 Data 18 octombrie 2022 17:04:42
Problema Combinari Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <stdio.h>
#include <string.h>



FILE *fin, *fout;
int N;    // numarul total al elementelor de combinat
int M;    // numarul elementelor din fiecare combinatie

#define MAX_COMB 30      // poate fi definit oricat

FILE *fin, *fout;
int sol[MAX_COMB];
int tot=0;


int main( void )
{
   // citeste valorile din fisierul "combinari.in" si 
   // scrie in fisierul "combinari.out" toate variantele combinarilor
   fin = fopen("combinari.in", "r");
   fout = fopen("combinari.out", "w");
   fscanf(fin, "%d%d", &N, &M);
//   printf("N=%d     M=%d\n", N, M);
   int i, j, k;


   if (N<M)
      printf("EROARE - numarul total al elementelor N=%d\n e mai mic decat numarul elementelor in varianta M=%d\n", N,M); 
   else if (M==0)
      printf("EROARE - nu sunt elemente de afisat in varianta: M=%d\n", M);
   else if (M>MAX_COMB)
      printf("EROARE - prea mare numaul elementelor in varianta"); 
   j=1;                 // indexul urmatorului element sol[] din solutia de afisat
   sol[0] = 1;          // initializez primul element de afisat din solutia sol[M], elementul de referinta
   while ( j>0 )
   {
      // gasesc valorile pentru urmatoarele elemente din combinatie 
      i=j;
      while ( i<M )
      {
         sol[i] = sol[i-1] + 1;  // atribui valoarea pentru elementul i
         i++;                    // urmatorul element
      }

      // scriu solutia in fisierul de iesire
      for (k=0; k<M; k++)
         fprintf (fout, "%d ", sol[k]);
      fprintf(fout, "\n");


      // afisez solutia si pe ecran
//      for (k=0; k<M; k++)
//         printf ("%d ", sol[k]);
//      printf("\n");
      tot++;


      // verific de la ultimul element din varianta catre primul, daca este elemntul maxim 
      // pentru ultimul element, sol[M-1] maxim va fi N, pentru urmatorul (sol[M-2]) va fi N-1 s.a.m.d.
      j = M-1;
      while (j>=0)
      {
         if (sol[j] < N - (M-1-j) )
         {
            // inca nu a ajuns la elementul maxim, deci il incrementez si parasesc bucla while pentru o noua solutie de afisat
            sol[j]++;      // incrementez solutia (noua valoare) pentru referinta
            j++;           // elementul j va fi acum indexul solutiei aflate in prima bucla while(i) 
            break;
         }
         else
            // a ajuns la elementul maxim, deci va trebui testat si elementul anterior
            j--;
      }

   }
   printf("\nTOTAL = %d variante\n", tot); 

   return 0;
}