Cod sursa(job #428826)

Utilizator klamathixMihai Calancea klamathix Data 29 martie 2010 16:37:11
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 15;
int i , j , n ;
char s[maxn];
bool A[maxn][maxn] ;
bool f[maxn][maxn];
int sr[maxn];
int sol;

bool ok (int nr)
{
	memset ( f , 0 , sizeof(f));
	int i , j;
	for( i = 1 ; i <= n ; ++i )
		for( j = 1 ; j <= n ; ++j )
			if ( A[i][j] == 1 ) 
				f[sr[i]][sr[j]] = 1;
			
	for( i = 1 ; i <= nr ; ++i)
		for( j = 1 ; j <= nr ; ++j )
			if ( i != j && f[i][j] == 0 ) return false;
return true;
}
void back(int p , int nr) {
	
	if ( p == n + 1 ) {
		if ( nr > 1 ) 
		sol += ok(nr);
		return ;
	}
	int i;
	
	for( i = 1 ; i <= nr ; ++i )
		sr[p] = i , back ( p + 1 , nr );
	
	sr[p] = nr + 1;
	back ( p + 1 , nr + 1 );
}

int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	scanf("%d\n",&n);
	for( i = 1 ; i <= n ; ++i ) {
		fgets ( s , maxn , stdin);
		for( j = 0 ; s[j] == '1' || s[j] == '0' ; ++j )
			A[i][j + 1] = s[j] - '0';
	}
	back ( 1 , 0 );
	printf("%d\n",sol);
	
return 0;
}