Cod sursa(job #806214)
/*
* =====================================================================================
*
* Filename: submultimi.cpp
*
* Description: Problema submultimi de pe infoarena.Fie mulţimea
* An = {1, 2, 3, ..., n}. Se cere să se determine toate submulţimile
* mulţimii An.
*
* Version: 1.0
* Created: 11/02/2012 12:15:38 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include<iostream>
#include<cstdio>
using namespace std;
FILE *in,*out;
class Submultimi
{
int* v;
int N,k;
public:
Submultimi(int);
int cont(int);
int sol(int);
void retine(int);
void back(int);
void solve();
~Submultimi();
};
Submultimi::Submultimi(int n = 0) : N(n)
{
v = new int[17];
for(int i = 0 ; i < N ; i++)
v[i] = 0;
k = 1;
}
int Submultimi::cont(int vf)
{
if(vf >= 2)
if(v[vf-1] >= v[vf])
return 0;
return 1;
}
int Submultimi::sol(int vf)
{
if( vf == k )
return 1;
return 0;
}
void Submultimi::retine(int vf)
{
for(int i = 1 ; i <= vf ; i++)
fprintf(out,"%d ",v[i]);
fprintf(out,"\n");
}
void Submultimi::back(int vf)
{
for(int i = v[vf-1] + 1 ; i <= N ; i++)
{
v[vf] = i;
if( cont(vf) )
if( sol(vf) )
retine(vf);
else
back(vf+1);
}
}
void Submultimi::solve()
{
for(k = 1 ; k <= N ; k++)
back(1);
}
Submultimi::~Submultimi()
{
delete [] v;
}
int main()
{
int number;
in = fopen("submultimi.in","r");
out = fopen("submultimi.out","w");
fscanf(in,"%d",&number);
Submultimi S(number);
S.solve();
fclose(in);
fclose(out);
return 0;
}