Cod sursa(job #713327)
#include<iostream>
#include<fstream>
using namespace std;
char c[11][11];
int st[11],nc,d[11][11],cls[11],n;
long long s;
void verificare()
{
int i,j,x;
for(i=1;i<=n;i++)
for(j=0;j<=n-1;j++)
d[i][j]=0;for(i=1;i<=n;i++)
cls[i]=0;
for(i=1;i<=n;i++)
for(j=0;j<=n-1;j++)
if(c[i][j]=='1')
d[st[i]][j+1]=1;
x=1;
for(i=1;i<=nc;i++) {
for(j=1;j<=n;j++)
if(d[i][j]==1)
cls[st[j]]=1;
for(j=1;j<=nc;j++)
if((cls[j]==0)&&(j!=i)) {
x=0;
break;
}
}
if(x==1)
s++;
}
void bktr(int p)
{
int pval;
if((p-1)==n) {
if(nc>=2)
verificare();
}
else {
for(pval=1;pval<=nc;pval++) {
st[p]=pval;
bktr(p+1);
}
nc++;
st[p]=nc;
bktr(p+1);
nc--;
}
}
int main ()
{
int i;
ifstream f("copii.in");
ofstream g("copii.out");
f>>n;
for(i=1;i<=n;i++)
f>>c[i];
f.close();
bktr(1);
g<<s;
g.close();
return 0;
}