Pagini recente » Borderou de evaluare (job #2443858) | Borderou de evaluare (job #1524693) | Cod sursa (job #1862120)
#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;
}