/*
如果状态压缩以后能保留我们解题需要的全部信息,就可以压缩 。
*/
/*
dp[i]=min(dp[i],dp[j^i]+dp[j]);图的两个子图集的涂色数相加。比如1-2-3-4-5-6这样的图,我们预处理时会得到dp[图:1-3-5]=1,dp[图:2-4-6]=1
那么dp[1-2-3-4-5-6]更新时就会变成2;
*/
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
bool a[17][17];
bool flag[1<<16]; //存储每一个状态。
bool ok[17];
int dp[1<<16];
unsigned int sum,n,c;
bool check(int cur){
memset(ok,0,sizeof(ok));
for(int i=0;i<n;i++){
if(cur&(1<<i)) ok[i+1]=true;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]&&ok[i]&&ok[j]) return false;
}
}
return true;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
char ch;
cin>>ch;
a[i][j]=ch-'0';
}
}
for(int i=1;i<1<<n;i++){ //计算出每一种状态。
flag[i]=check(i);
}
c=233;
for(int i=1;i<1<<n;i++,c*=233){
if(flag[i]) dp[i]=1;
else{
dp[i]=inf;
for(int j=i;j;j=(j-1)&i)
dp[i]=min(dp[i],dp[j]+dp[i^j]);
}
sum+=dp[i]*c;
}
cout<<sum<<endl;
return 0;
}