#include <bits/stdc++.h>
using namespace std;

int n;
char can[45][45];

long long memo[45][45][45];

long long dp(int i,int j,int k){
	if ((j^i)&1) return 0;
	if (i==j) return 1;
	if (i==k || j==k) return 0;
	else if (memo[i][j][k]!=-1) return memo[i][j][k];
	
	long long ans=0;
	
	for (int x=i;x<k;x++){
		for (int y=k+1;y<=j;y++){
			if (can[x][y]=='0') continue;
			for (int d1=x+1;d1<=k;d1++){
				for (int d2=k+1;d2<=y;d2++){
					ans+=dp(i,d1-1,x)*dp(d1,d2-1,k)*dp(d2,j,y);
				}
			}
		}
	}

	return memo[i][j][k]=ans;
}

int main(){
	memset(memo,-1,sizeof(memo));

	scanf("%d",&n);
	
	for (int x=1;x<=2*n;x++){
		scanf("%s",can[x]+1);
	}
	
	long long ans=0;
	
	for (int x=2;x<=2*n;x++){
		if (can[1][x]=='1') ans+=dp(2,2*n,x);
	}
	
	printf("%lld\n",ans);
}