Cod sursa(job #668908)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 25 ianuarie 2012 20:27:31
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.72 kb
#include<cstdio>
using namespace std;
char s[100];
long nc,p[100],q[100],nr,n,a[100],i,j,pp,qq;
void soll()
{
	long i;
	for(i=1;i<=nc;++i)
    for(j=1;j<=nc;++j)
		if(i!=j)
			if((q[i]&p[j])==0)	return;
	nr++;
}
void backtracking(long k)
{
	long j;
	if(k-1==n){if(nc>1)soll();}
	else
	{
		for(j=1;j<=nc;++j){
			pp=p[j];
			p[j]|=(1<<(k-1));
			qq=q[j];
			q[j]|=a[k];
			backtracking(k+1);
			p[j]=pp;
			q[j]=qq;
		}
	nc++;
	p[nc]=(1<<(k-1));
	q[nc]=a[k];
	backtracking(k+1);
	nc--;
	}
}
int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	scanf("%ld\n",&n);
	for(i=1;i<=n;++i){
		gets(s);
		for(j=1;j<=n;++j)
			if(s[j-1]=='1') a[i]|=(1<<(j-1));
	}
	backtracking(1);
	printf("%ld\n",nr);
	return 0;
}