Cod sursa(job #421539)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 21 martie 2010 14:33:31
Problema Copii Scor 30
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 5-8 Marime 0.96 kb
#include<stdio.h>
int n,m,nre,sol,solf=0,st[12],f[12],perm[12];
char s[12][12];

void back(int k)
{
	if(nre-f[0]>n-k+1)
		return;
	if(k==n+1)
	{
		int i,j,e[12][12]={0};
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
				if(st[i]!=st[j] && s[i][j]=='1')
					e[st[i]][st[j]]=1;
		}
		for(i=1;i<=nre;i++)
			for(j=1;j<=nre;j++)
				if(i!=j && e[i][j]==0)
					return;
		sol++;
		return;
	}
	int i;
	for(i=1;i<=nre;i++)
	{
		st[k]=i;
		if(f[i]==0)
			f[0]++;
		f[i]++;
		back(k+1);
		f[i]--;
		if(f[i]==0)
			f[0]--;
	}
}

int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	scanf("%d\n",&n);
	int i,j,nr1=0,lim;
	perm[0]=1;
	for(i=1;i<=n;i++)
	{
		gets(s[i]+1);
		for(j=1;j<=n;j++)
			nr1+=(s[i][j]=='1');
		perm[i]=i*perm[i-1];
	}
	if(nr1==n*(n-1))
		lim=n;
	else
		lim=n-1;
	for(nre=2;nre<=lim;nre++)
	{
		back(1);
		solf=solf+sol/perm[nre];
		sol=0;
	}
	printf("%d\n",solf);
	return 0;
}