Pagini recente » Cod sursa (job #1787819) | Cod sursa (job #121086) | Cod sursa (job #2159691) | Cod sursa (job #3175824) | Cod sursa (job #2434251)
#include <iostream>
#include <vector>
#include <unordered_map>
#include <fstream>
using namespace std;
ifstream f("combinari.in");
ofstream g("combinari.out");
bool check(std::vector<int> &solution) {
return true;
}
bool printSolution(std::vector<int> &solution, std::vector<int> &domain, int stop) {
/*for (unsigned i = 0; i < stop; ++i) {
std::cout << domain[solution[i]] << " ";
}
std::cout << " ";*/
for(int s : solution)
g << s << " ";
g << "\n";
}
void back(int step, int stop, std::vector<int> &domain,
std::vector<int> &solution) {
/* vom verifica o solutie atunci cand am adaugat deja K elemente in solutie,
adica step == stop */
if (step == stop) {
/* deoarece am avut grija sa se adauge elementele doar in ordine
crescatoare, "check()" va returna intotdeauna "true" */
if(check(solution)) {
printSolution(solution, domain, stop);
}
return;
}
/* daca este primul pas, alegem fiecare element din domeniu ca potential
candidat pentru prima pozitie in solutie; altfel, pentru a elimina ramurile
in care de exemplu {2, 1} se va genera dupa ce s-a generat {1, 2} (adica
ar fi duplicat), vom folosi doar elementele din domeniu care sunt mai mari
decat ultimul element adaugat in solutie (solution[step - 1]) */
unsigned i = step > 0 ? solution[step - 1] + 1 : 0;
for (; i < domain.size(); ++i) {
solution[step] = i;
back(step + 1, stop, domain, solution);
}
}
int main(int argc, char *argv[]) {
int n, k;
f >> n >> k;
/* dupa ce citim n si k initializam domeniul cu valorile de la 1 la n,
iar solutia este initializata cu un vector de k elemente (fiindca o
combinare de "n luate cate k" are k elemente) */
std::vector<int> domain(n), solution(k);
for (int i = 0; i < n; ++i) {
domain[i] = i + 1;
}
back(0, k, domain, solution);
}