Cod sursa(job #526802)

Utilizator icepowdahTudor Didilescu icepowdah Data 29 ianuarie 2011 14:53:38
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;

#define MAXN 8

ifstream f("permutari.in");
ofstream g("permutari.out");

void gen_permutari(int solution[], int N, int k);
bool isSolution(int solution[], int N, int k);
void processSolution(int solution[], int k);
void generateCandidates(int solution[], int N, int k, int candidates[], int *numCandidates);

int main(void)
{
	int N;
	int solution[MAXN+1];

	f >> N;
	gen_permutari(solution, N, 0);

	f.close();
	g.close();
	return 0;
}

void gen_permutari(int solution[], int N, int k)
{
	if (isSolution(solution,N,k))
	{
		processSolution(solution,k);
	}
	else 
	{		
		int i, numCandidates;
		int candidates[MAXN];
		
		k++;		
		generateCandidates(solution,N,k,candidates,&numCandidates);

		for (i=0;i<numCandidates;i++)
		{
			solution[k] = candidates[i];
			gen_permutari(solution,N,k);
		}
	}
}

bool isSolution(int solution[], int N, int k)
{
	return k == N;
}

void processSolution(int solution[], int k)
{
	for (int i=1;i<=k;i++)	
	{
		g << solution[i] << " ";
	}
	g << "\n";
}

void generateCandidates(int solution[], int N, int k, int candidates[], int *numCandidates)
{
	int i, inPerm[MAXN];

	for (i=0;i<N;i++) inPerm[i] = false;
	for (i=1;i<k;i++) inPerm[solution[i]-1] = true;

	*numCandidates = 0;
	for (i=1;i<=N;i++)
	{
		if (!inPerm[i-1])
		{
			candidates[*numCandidates] = i;
			*numCandidates += 1;
		}
	}
}