Cod sursa(job #487594)

Utilizator indestructiblecont de teste indestructible Data 25 septembrie 2010 18:32:54
Problema Copii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>
#define NMAX 12
char A[NMAX][NMAX],marc[NMAX][NMAX];
int n,sols,part[NMAX];
void read()
{
	scanf("%d\n",&n);
	int i;
	for (i=1; i<=n; i++)
		fgets(A[i]+1,NMAX,stdin);
}
void actualize(int k,int p,int nr)
{
	int i;
	for (i=1; i<k; i++)
	{
		if (A[k][i]=='1')
			marc[p][part[i]]+=nr;
		if (A[i][k]=='1')
			marc[part[i]][p]+=nr;
	}
}
inline int verif(int p)
{
	int i,j;
	for (i=1; i<=p; i++)
		for (j=1; j<=p; j++)
			if (i!=j && !marc[i][j])
				return 0;
	return 1;
}
void bkt(int k,int p)
{
	if (k==n+1)
	{
		if (verif(p))
			sols++;
		return ;
	}
	int i;
	for (i=1; i<=p; i++)
	{
		part[k]=i;
		actualize(k,p,1);
		bkt(k+1,p);
		actualize(k,p,-1);
	}
	part[k]=p+1;
	actualize(k,p+1,1);
	bkt(k+1,p+1);
	actualize(k,p+1,-1);
}
int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	read();
	bkt(1,0);
	printf("%d\n",sols-1);
	return 0;
}