Cod sursa(job #478548)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 19 august 2010 04:44:11
Problema Combinari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
/* Vom genera combinari (n, m) cu ajutorul recursivitatii.
** In vectorul c vom retine cele m componente (nr cu valori 1 -> n).
** De la k la m trebuie completate m - k pozitii, iar
** cea mai mare valaore care se poate situa pe pozitia k este n. Am stabilit
** ca numerele vor fi ordonate crescator, prin urmare pe trebuie sa avem
** c[k-1] < c[k] < c[k+1]. Astfel, valoarea minima care poate fi pusa pe pozitita k
** este c[k-1] + 1.
** Cea mai mare valoare pe care o putem pune pe pozitia k este n - m + k.

** Vom parcurge elementele de la c[k-1] + 1 pana la n - m + k si vom genera combinarile
** care au pe pozitia k un numar situat in acest interval. Apoi vom apela recursiv
** functia combinari () pentru k + 1.

** Autor : Albulescu Cosmina (miculprogramator)
*/
#include <stdio.h>
using namespace std;

FILE *g = fopen ("combinari.out","w");
int c[20];
int n, m;

void afisare ()
{
    int i;

    for (i=1; i<=m; ++i)
        fprintf (g,"%d ", c[i]);
    fprintf (g,"\n");
}

void combinari (int k)
{
    int i;
    if (k - 1 == m)
        afisare ();
    else
    {
        for (i=c[k-1]+1; i<=n - m + k; ++i)
        {
            c[k] = i;
            combinari (k + 1);
        }
    }
}

int main ()
{
    FILE *f = fopen ("combinari.in","r");
    fscanf (f,"%d %d", &n, &m);

    combinari (1);

    fclose (f);
    fclose (g);
    return 0;
}