Cod sursa(job #530439)

Utilizator lianaliana tucar liana Data 7 februarie 2011 19:42:40
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 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;
}