Cod sursa(job #614168)

Utilizator joli94Apostol Adrian Alexandru joli94 Data 5 octombrie 2011 19:50:40
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<cstdio>
#include<cstring>

const int N = 11;
char a[N][N] , b[N][N] , sol[N];
int n , s ;

void read()
{
	freopen ( "copii.in" , "r" , stdin );
	freopen ( "copii.out" , "w" ,stdout );
	
	scanf( "%d\n" , &n );
	
	for(int i=1 ; i<=n ; ++i)
	{
		gets(1+a[i]);
	}
}

void verif(int m)
{
	if(m==1) return;
	/*
	for(int i=1 ; i<=n ; i++)
		printf("%d ",sol[i]);
	printf("\n");
	*/
	for(int i=1 ; i<=m ; i++)
		for(int j=1 ; j<=m ; j++)
			b[i][j] = 0;
	for(int i=1 ; i<=n ; ++i)
	{
		for(int j=1 ; j<=n ; ++j)
			if(a[i][j]!='0') 
			{
				b[sol[i]][sol[j]] = 1;
			}
	}
	/*
	for(int i=1 ; i<=m ; i++)
	{
		for(int j=1 ; j<=m ; j++)
			printf("%5d",b[i][j]);
		printf("\n");
	}
	*/
	for(int i=1 ; i<=m ; i++)
		for(int j=1 ; j<=m ; j++)
			if(i!=j && b[i][j]==0)
				return;
	s++;
}

void bkt(int p , int m)
{
	if (p-1==n) 
	{
		verif(m);
		return;
	}
	for(int i=1 ; i<=m ; ++i)
	{
		sol[p] = i;
		bkt(p+1 , m);
	}
	sol[p] = 1+m;
	bkt(p+1 , m+1);
}

void solve()
{
	bkt(1,0);
	printf( "%d\n" , s);
}

int main()
{
	read();
	solve();
	return 0;
}