Cod sursa(job #162100)

Utilizator reSpawnPopescu Ioan reSpawn Data 19 martie 2008 14:31:59
Problema Combinari Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
// http://infoarena.ro/problema/permutari
#include <stdio.h>

int N;
char st[8]; // 1 <= N <= 8

void init( char k )
{
	st[k] = 0;
}

char succesor( char k )
{
	if( st[k] < N )
	{
		++st[k];
		return 1;
	}
	return 0;
}

char valid( char k )
{
	static char i;
	for( i = 0; i < k; ++i )
		if( st[i] == st[k] )
			return 0;
	return 1;
}

char solutie( char k )
{
	if( k == N-1 )
		return 1;
	return 0;
}

void tiparire()
{
	static char i;
	printf("%d", st[0] );
	for( i = 1; i < N; i++ )
		printf( " %d", st[i] );
	printf("\n");
}

int main()
{
	freopen( "permutari.in", "r", stdin );
	freopen( "permutari.out", "w", stdout );

	scanf( "%d", &N );
	char k = 0;
	char as = 0, ev = 0;
	init( k );
	while( k >= 0 )
	{
		do
		{
			as = succesor( k );
			if( as )
				ev = valid( k );
		} while( as && !ev );
		
		if( as )
		{
			if( solutie( k ) )
				tiparire();
			else
			{
				init( ++k );
			}
		}
		else
			k--;
	}

	return 0;
}