Cod sursa(job #537049)

Utilizator ibicecIT Zilla ibicec Data 19 februarie 2011 22:19:57
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void *a, const void *b)
{
	return *(char*)a - *(char*)b;
}

void next_perm(char s[])
{
	int a, b, i, len = strlen(s);
	char tmp;

	for (i=len-1; i>0; i--)
		if (s[i-1] < s[i])
		{
			a = i-1;
			break;
		}

	for (i=len-1; i>0; i--)
		if ( s[i] > s[a] )
		{
			b = i;
			break;
		}

	tmp = s[a];
	s[a] = s[b];
	s[b] = tmp;

	qsort(s+a+1, len-a-1, sizeof(char), cmp);
}

int factorial(int n)
{
	int r = 1;
	for ( int i=2; i<=n; i++)
		r *= i;
	return r;
}

int main()
{
    int n;

	FILE *in = fopen("permutari.in", "r");
	fscanf(in, "%d", &n);
	fclose(in);

	FILE *out = fopen("permutari.out", "w");

	char *s = (char*)calloc( n+1, sizeof(char) );
	for (int i=0; i<n; i++)
		s[i] = i+1+'0';

    for (int i=0; i<n; i++)
	    fprintf(out, "%c ", s[i]);
    fprintf(out, "\n");

	int nfact = factorial(n);
	for (int i=0; i<nfact-1; i++)
	{
		next_perm(s);
        for (int j=0; j<n; j++)
            fprintf(out, "%c ", s[j]);
        fprintf(out, "\n");
	}

	fclose(out);
}