Backtracking – combinari

Se citesc 2 numere naturale nenule k,n unde k < n. Să se afişeze toate combinările a k numere din mulţimea (1,2,. ..n}.
#include “stdio.h”
#include “conio.h”
int m,n,a[20];
//funcţia de afişare a soluţiei
void scrie(void)
{
  int i;
  for(i=0;i < n;i++)   printf("%d ",a[i]+1);   //deoarece lucrăm cu indici de la 0, vom adăuga 1 la valorile rezultate   putchar("\n"); } //funcţia recursivă de generare a combinărilor void comb(int k) {   int i;   //vom încerca să aşezăm pe poziţia curentă, pe rând, toate valorile de la 0 la m-1   for(i=0;i < m;i++)   //încercăm pe poziţia curentă valoarea i   {     a[k]=i;     //dacă este prima valoare aşezată sau dacă ea este mai mare decât     //precedenta putem continua; în caz contrar vom încerca o altă valoare     //a lui i pe poziţia curentă     if((k == 0)||(a[k] > a[k-1]))
      if(k == n-1)
      //dacă am aşezat n valori (de la 0 la n-1) am ajuns la soluţie
      scrie();
    else
      //dacă nu, apelăm funcţia de aşezare a următoarei poziţii
      comb(k+1);
  }
}

void main(void)
{
  printf(“Introdu pe m:”);
  scanf(“%d”,&m);
  printf(“Introdu pe n:”);
  scanf(“%d”,&n);
  //apelăm funcţia recursivă comb încercând să aşezăm primul element
  comb(0);
  getch();
}

Leave a Reply