Cod sursa(job #3310780)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 16 septembrie 2025 20:57:21
Problema Combinari Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#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;
}