#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
ifstream cin ("copii.in");
ofstream cout ("copii.out");
int m[15][15],fin[15][15],n,s=0,care[15];
vector <int> v[15];
bool verif (int k)
{
int i,j;
if(k==1)
return false;
for(i=1;i<=k;++i)
for(j=1;j<=k;++j)
fin[i][j]=0;
for(i=1;i<=k;++i)
for(j=0;j<v[i].size();++j)
care[v[i][j]]=i;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(m[i][j])
fin[care[i]][care[j]]=1;
for(i=1;i<=k;++i)
for(j=1;j<=k;++j)
if(fin[i][j]==0 && i!=j)
return false;
return true;
}
void bck (int poz, int k)
{
if(poz==n+1)
{
if(verif(k))
++s;
return;
}
for(int j=1;j<=k;++j)
{
v[j].push_back(poz);
bck(poz+1,k);
v[j].pop_back();
}
v[++k].push_back(poz);
bck(poz+1,k);
v[k--].pop_back();
}
int main()
{
long long i,j,mx=0;
cin>>n;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
char c;
cin>>c;
m[i][j]=c-'0';
}
bck(1,0);
cout<<s;
}