Cod sursa(job #551864)

Utilizator laurionLaurentiu Ion laurion Data 11 martie 2011 10:51:38
Problema Copii Scor 100
Compilator cpp Status done
Runda bkt Marime 0.84 kb
#include <stdio.h>

long int j, nr, rez, n, lg;
long int v[12], pe[12], o[12];
bool ok;
char s[12];

void citire()
{
	long int i;
	scanf("%ld",&n);
	for (j=1;j<=n;j++)
	{
		scanf("%s",&s);
		nr=0;
		for (i=0;i<n;i++)
			nr+=(1<<(i+1))*(s[i]-'0');
		v[j]=nr;
	}
}


void verificare()
{
	long int i;
	ok=true;
	if (lg==1)
		ok=false;
	for (i=1;i<=lg;i++)
		for (j=1;j<=lg;j++)
			if (i!=j)
				if ((pe[i] & o[j])==0)
				{	ok=0; break; }
	rez+=ok;
}

void gen(long int poz)
{
	long int pran, i;
	if (poz==n+1)
		verificare();
	else
	{
		for (i=1;i<=lg;i++)
		{
			o[i]=o[i]+(1<<poz); pran=pe[i]; pe[i]=pe[i] | v[poz];
			gen(poz+1);
			o[i]=o[i]-(1<<poz); pe[i]=pran;
		}
		o[++lg]=1<<poz; pe[lg]=v[poz];
		gen(poz+1);
		lg--;
	}

}

int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	citire();
	gen(1);
	printf("%ld",rez);
	return 0;
}