Pagini recente » Cod sursa (job #2397134) | Cod sursa (job #1677956)
#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;
}