Pagini recente » Cod sursa (job #238883) | Cod sursa (job #2925435) | Cod sursa (job #3312200) | Cod sursa (job #3318852) | Cod sursa (job #3310780)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("combinari.in");
ofstream g("combinari.out");
void afis(const vector<int> &v)
{
for (auto nr: v)
{
g << nr << ' ';
}
g << '\n';
}
bool valid(int nivel, vector<int> &sol)
{
/// vrem ca elementele sa fie in ordine crescatoare
if (nivel == 0)
{
return true;///daca esti la prima pozitie nu are ce sa creeze conflicte
}
// for (int i = 0; i < nivel; i++)
// {
// if (sol[i] == sol[nivel])
// {
// return false; /// nu putem avea elemente egale intr-o submultime
// }
// }
if (sol[nivel] <= sol[nivel -
1]) /// stiue ca vectorul este valid pana la nivelul nivel, asa ca trebuie doar ca sol[nivel] sa fie mai mare ca sol[nivel-1]
{
return false; /// nu este valid, deoarece elementele trebuie sa fie in ordine crescatoare
}
return true;
}
void backt(int nivel, const int n, const int k, vector<int> &sol)
{
///backt(nivel, n ,k , sol) incearca sa gaseasca o posibila valoare pentru indicele nivel, avand vectorul de solutii pana in momentul de fata
if (nivel == k) /// cand am pus pe toate pozitiile de la 0 la k-1, avem in total k numere
{
afis(sol);
return;
}
for (int i = 1; i <= n; i++)
{
sol[nivel] = i;
if (valid(nivel, sol))
{
backt(nivel + 1, n, k, sol);
}
}
}
int main()
{
int n, k;
f >> n >> k;
vector<int> sol(k);
backt(0, n, k, sol);
return 0;
}