Cod sursa(job #421591)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 21 martie 2010 14:46:08
Problema Copii Scor 0
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.44 kb
#include <cstdio>

int st[13], a[13][13], n, u[13], b[13][13], cnt;
char s[13];

void comb(int, int, int, int, int, int);

int verif(int u[13], int k)
{
	int i, j, ok;
	for (i=1; i<=k; i++)
		for (j=1; j<=n; j++) b[i][j]=0;
	for (i=1; i<=n; i++) 
		for (j=1; j<=n; j++) 
			b[u[i]][u[j]]+=a[i][j];
	ok=1;
	for (i=1; i<=k && ok; i++)
		for (j=1; j<=k; j++)
			if (i!=j)
			if (!b[i][j])
			{
				ok=0;
				break;
			}
	return ok;
}

void gen(int p, int st[13], int d, int k, int dinit)
{
	if (p>k)
	{
		if (verif(u,k)) cnt++;
	} else
		comb(1,st[p],p,d,k,dinit);
}

void comb(int p, int l, int t, int d, int k,int dinit)
{
	int i;
	//printf("%d %d %d %d\n",p,d,l,t);
	if (p>l)
	{
		if (st[t]==st[t+1]) gen(t+1,st,dinit+1,k,dinit+1); else
		gen(t+1, st, 1, k,1);
	} else
		for (i=d; i<=n; i++)
			if (!u[i])
			{
				u[i]=t;
				//printf("%d\n",i);
				comb(p+1, l, t, i+1, k,dinit);
				u[i]=0;
			}
}

void part(int st[13], int k, int s, int n)
{
	int i;
	if (n==s)
	{
		if (k>1)
		{
			for (i=1; i<=n; i++) u[i]=0;
			gen(1,st,1,k,1);
		}
	} else
	if (s<n)
		for (i=st[k]; i<=n-s; i++)
		{
			st[k+1]=i;
			part(st,k+1,s+i,n);
		}
}

int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	scanf("%d\n",&n);
	int i, j;
	for (i=1; i<=n; i++)
	{
		scanf("%s",s);
		for (j=1; j<=n; j++) a[i][j]=s[j-1]-'0';
	}
	st[0]=1;
	part(st,0,0,n);
	printf("%d",cnt);
}