Cod sursa(job #806214)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 2 noiembrie 2012 01:02:29
Problema Submultimi Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
/*
 * =====================================================================================
 *
 *       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;
}