Cod sursa(job #551896)
#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;
}