Cod sursa(job #614170)

Utilizator alutzuAlexandru Stoica alutzu Data 5 octombrie 2011 19:54:53
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<cstdio>

const int NMAX = 12 ;

bool a[NMAX][NMAX];
bool b[NMAX][NMAX];
int n ;
int st[NMAX];
int NRSOL = 0 ;

void update_mat ( int copil , int mult )
{
	for ( int i = 1 ; i <= n ; ++ i )
		b[mult][st[i]] = b[mult][st[i]] || a[copil][i] ;
}

void verif ( int m ) //fake afisare
{
	int i , j ;
	if ( m == 1 )
		return ;
	/*for ( i = 1 ; i <= n ; ++ i )
		printf ( "%d ", st[i] ) ;
	printf ( "\n" ) ;*/
	//fake afisare no more
	for ( i = 1 ; i <= m ; ++ i )
		for ( j = 1 ; j <= m ; ++ j )
			b[i][j] = 0 ;
	for ( int i = 1 ; i <= n ; ++ i )
	{
		update_mat ( i , st[i] ) ;
	}
	for ( i = 1 ; i <= m ; ++ i )
		for ( j = 1 ; j <= m ; ++ j )
			if ( !b[i][j] && i != j )
				return ;
	/*printf ( "%d---\n" , m );
	for ( int i = 1 ; i <= m ; ++ i )
	{
		for ( int j = 1 ; j <= m ; ++ j )
			printf ( "%d " , b[i][j] ) ;
		printf ( "\n" ) ;
	}
	printf ( "\n\n" );*/
	++NRSOL;
}

void bkt ( int k , int m )
{
	if ( k - 1 == n )
	{
		verif ( m );
		return ;
	}
	//printf ( "bkt - %d %d\n" , k , m ) ;
	for ( int i = 1 ; i <= m ; ++ i )
	{
		st[k] = i ;
		bkt ( k + 1 , m ) ;
	}
	st[k]=m+1 ;
	bkt ( k + 1 , m + 1 ) ;
}

int main ( )
{
	
	freopen ( "copii.in" , "r", stdin ) ;
	freopen ( "copii.out" , "w" , stdout ) ;
	
	int i , j ;
	char s_current[NMAX];
	
	scanf ( "%d " , & n ) ;
	//printf ( "%d ", n ) ;
	for ( i = 1 ; i <= n ; ++ i )
	{
		gets ( s_current ) ;
		for ( j = 0 ; s_current[j] ; ++ j )
			if ( s_current[j] == '1' )
				a[i][j+1]=true ;
		//printf ( "%s " , s_current ) ;
	}
	
	bkt ( 1 , 0 ) ;
	printf ( "%d" , NRSOL ) ;
	return 0 ;
}