Pagini recente » Cod sursa (job #2053229) | Cod sursa (job #2065197) | Cod sursa (job #1662357) | Cod sursa (job #2719764) | Cod sursa (job #478548)
Cod sursa(job #478548)
/* 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;
}