Cod sursa(job #216277)
#include<stdio.h>
#define nmax 101
int v[nmax],x[nmax];
char viz[nmax];
int i,n,m;
void combinari(int v[], int x[], char viz[], int n, int m, int k, int poz)
{
int i;
if(k>m) //avem o noua combinatie completa
{
for(i=1;i<=m;i++)
printf("%d ",x[i]); //afisem combinatia
printf("\n"); //afisem ecaracterul pt rand nou, deoarece s-a terminat afisarea combinatiei
}
else //Permutarea nu este completa, deci adaugam un nou element
for(i=poz+1;i<=n-m+k;i++) //Luam toate elementele care trebuie permutate pentru a obtine o noua combinatie
if(!viz[i]) //Daca elementul nu a fost folosit in aceasta permutare
{
viz[i]=1; //Marcam ca elementul de la pozitia i a fost luat in aceasta permutare
x[k]=v[i]; //Punem in vector noul element al permutarii
combinari(v,x,viz,n,m,k+1,i); //Apelam functia pentru pozitia urmatoare din permutare
viz[i]=0; //Scoatem din viz pozitia i
}
}
int main()
{
freopen("combinari.in","r",stdin);
freopen("combinari.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;v[i]=i++);
combinari(v,x,viz,n,m,1,0);
fclose(stdin);
fclose(stdout);
return 0;
}