Cod sursa(job #421417)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 21 martie 2010 13:52:34
Problema Copii Scor 100
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 9-10 Marime 1.47 kb
#include <stdio.h>
#include <vector>
#define NMAX 12
#define LMAX 25
#define pb push_back
using namespace std;
int n,A[NMAX][NMAX],poz,rez,B[NMAX],r,s,D[NMAX];
char marc[NMAX],line[LMAX];
vector <int> C[NMAX];
void read()
{
	scanf("%d\n",&n);
	int i,j;
	for (i=1; i<=n; i++)
		B[i]=i;
	for (i=1; i<=n; i++)
	{
		fgets(line+1,LMAX,stdin);
		for (j=1; j<=n; j++)
			A[i][j]=line[j]-'0';
	}
	r=n;
}
int verif(int subs)
{
	int i,j,k,ok1,ok2,nr,nr2;
	if (subs == 1)
		return 1;
	for (i=1; i<subs; i++)
	{
		ok1=0; ok2=0;
		for (j=0; j<C[i].size(); j++)
		{
			nr=C[i][j];
			for (k=0; k<C[subs].size(); k++)
			{
				nr2=C[subs][k];
				if (A[nr][nr2])
					ok1=1;
				if (A[nr2][nr])
					ok2=1;
			}
		}
		if (!ok1 || !ok2)
			return 0;
	}
	return 1;
}
void part(int subs)
{
	int i,j,t= (1<<(r-1))-1,p=(1<<r)-1,act,act2,l,E[NMAX];
	l=r;
	for (i=1; i<=r; i++)
		E[i]=B[i];//salvare vector
	if (!verif(subs-1))
		return ;
	if (r==0)
	{
		if( subs != 2)
			rez++;
		return ;
	}
	for (i=0; i<=t; i++)
	{
		act=(i<<1)+1;
		act2=p ^ act;
		C[subs].clear();
		s=0;
		for (j=1; j<=r; j++)
		{
			if (act & 1<<(j-1))
				C[subs].pb(B[j]);
			if (act2 & 1<<(j-1))
				D[++s]=B[j];
		}
		r=s;
		for (j=1; j<=s; j++)
			B[j]=D[j];
		part(subs+1);
		r=l;
		for (j=1; j<=r; j++)
			B[j]=E[j];
	}
}
int main()
{
	freopen("copii.in","r",stdin);
	freopen("copii.out","w",stdout);
	read();
	part(1);
	printf("%d\n",rez);
	return 0;
}