Cod sursa(job #551896)

Utilizator ChallengeMurtaza Alexandru Challenge Data 11 martie 2011 12:06:29
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>

using namespace std;

const char InFile[]="copii.in";
const char OutFile[]="copii.out";
const int MaxN=16;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,sol,v[MaxN],nextset,k;;
char A[MaxN][MaxN],E[MaxN][MaxN];

void back()
{
	if(k>N)
	{
		if(nextset>2)
		{
			int nrset=nextset-1;
			for(register int i=1;i<=nrset;++i)
			{
				for(register int j=1;j<=nrset;++j)
				{
					E[i][j]='0';
				}
			}
			for(register int i=1;i<=N;++i)
			{
				for(register int j=1;j<=N;++j)
				{
					if(A[i][j]=='1')
					{
						E[v[i]][v[j]]='1';
					}
				}
			}
			bool ok=true;
			for(register int i=1;i<=nrset;++i)
			{
				for(register int j=1;j<=nrset;++j)
				{
					if(i!=j)
					{
						if(E[i][j]=='0')
						{
							ok=false;
							goto papa;
						}
					}
				}
			}
			papa:
			if(ok)
			{
				++sol;
			}
		}
	}
	else
	{
		++k;
		for(register int i=1;i<nextset;++i)
		{
			v[k-1]=i;
			back();
		}
		v[k-1]=nextset;
		++nextset;
		back();
		--nextset;
		--k;
	}
}

int main()
{
	fin>>N;
	for(register int i=1;i<=N;++i)
	{
		fin>>(A[i]+1);
	}
	fin.close();
	
	nextset=1;
	k=1;
	back();
	
	fout<<sol;
	fout.close();
	return 0;
}