Cod sursa(job #1677956)

Utilizator ciprian.costeaCostea Ciprian Marian ciprian.costea Data 6 aprilie 2016 21:33:21
Problema Combinari Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

std::ofstream out("combinari.out");

void generateOneByOne(std::vector<int> &vec, int aux[], int start,
        int end, int index, int k)
{
    // are dimensiunea ceruta => afisam combinarea
    if(index == k)
    {
        for(int i = 0; i < k; i++)
        {
            out << aux[i] << " ";
        }
        out << "\n";
    }

    int i = start;
    while(i <= end && end - i + 1 >= k - index)
    {
        aux[index] = vec[i];
        generateOneByOne(vec, aux, i + 1, end, index + 1, k);

        // eliminam duplicatele
        while(vec[i] == vec[i + 1])
        {
            i++;
        }
        i++;
    }
}

void generateCombinations(vector<bool> &marcat, vector<int> &vec, 
                int indexk, int k, int indexn, int n)
{
    // indexn -> elementul ce se vrea inclus / exclus
    // indexk -> element deja inclus

   if(k > n)
   {
    return;
   }
   if(indexn == n)
   {
    if(indexk == k)
    {
        for(int i = n; i >= 0; i--)
        {
         if(marcat[i] == true)
          {
             out << vec[i] << " ";
          }
         }
    out << "\n";
    }
    return;
   }

   marcat[indexn] = false;
   generateCombinations(marcat, vec, indexk, k,
                     indexn + 1, n);

   // am inclus elementul -> marchez ca true si
   // merg mai departe
   marcat[indexn] = true;
   generateCombinations(marcat, vec, indexk + 1, k,
                     indexn + 1, n);
}

int main()
{
    std::ifstream fin("combinari.in");

    int n, k;
    fin >> n;
    fin >> k;
    vector<int> vec;
    vector<bool> marcat;

    for(int i = n ; i > 0; i--)
    {
        vec.push_back(i);
        marcat.push_back(false);
    }

    generateCombinations(marcat, vec, 0, k, 0 , n);

    fin.close(); out.close();
    return 0;
}