Cod sursa(job #1862120)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 29 ianuarie 2017 15:53:27
Problema Combinari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <bitset>

FILE *in,*out;

using namespace std;

const int nmax = 19;

int n, h; //combinari de n luate cate h
int sol[nmax]; //sol[0] = 0; sol[1] = 2; sol[2] = 1
bitset<nmax> visited;

//exploreaza-mi, te rog, spatiul solutiilor
//putem tine minte pragul peste care cautam valorile elementelor combinarii
void explore(int k) {  //vei avea nevoie de prag la implementare cu liste
  if(k == h) {
    for(int i = 0; i < h; i++)
      fprintf(out, "%d ", sol[i] + 1);
    fprintf(out, "\n");

  } else {
    //faci tot acest taraboi ca sa ii dai valori lui sol[k]
    //scrie-mi valoarea precedenta

    //sunt aici
    //am determinat elementele de pe indecsii 0, 1, 2,, .. k - 1
    //trebuie sa mai adaug: h - k elemente. daca h = 5, k = 3
    //facand abstractie de elementul curent, mai trebuie sa mai adaug h - k - 1
    //daca elementul meu are valoare i (sol[k] == i), asta inseamna ca mai raman valorile i+1, i+2, ... n-1 => n-i-1 valori
    // h-k-1 <= n-i-1 => i <= n +k -h
    for(int i = sol[k-1] + 1; i  <= n-h+k; i++){
      sol[k] = i;
      explore(k+1);
    }
  }
}


int main() {
  in = fopen("combinari.in","r");
  out = fopen("combinari.out","w");
  fscanf(in,"%d %d",&n,&h);

  //vei avea h elemente in sol
  for(int i=0; i<=n-h; i++) {  //C(9, 8)
    //seteaza-mi te rog priuma valoare
    sol[0] = i;
    explore(1);
  }
  return 0;
}