#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 16, M = 10,inf = 1e9;
int n,m = 8;
int s[M][M]; //表示二维前缀和
double f[M][M][M][M][N];
double X;
double get(int x1,int y1, int x2, int y2)
{
double sum = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] - X;
return sum * sum / n;
}
double dp(int x1,int y1, int x2, int y2, int k)
{
double &v = f[x1][y1][x2][y2][k]; //用指针简化表示
if(v >= 0) return v; //该值以及被算过了
if(k == 1) return v = get(x1,y1,x2,y2); //最后只有一部分了,计算结果
v = inf;
for (int i = x1; i < x2; i ++ ) //横切
{
v = min(v,dp(x1,y1,i,y2,k - 1) + get(i + 1,y1,x2,y2));//求上面最小值 + 下面的值
v = min(v,dp(i + 1,y1,x2,y2,k - 1) + get(x1,y1,i,y2));
}
for (int i = y1; i < y2; i ++ )
{
v = min(v,dp(x1,y1,x2,i,k - 1) + get(x1, i + 1,x2,y2));
v = min(v,dp(x1, i + 1,x2,y2,k - 1) + get(x1,y1,x2,i));
}
return v;
}
int main()
{
cin >> n;
for (int i = 1; i <= m; i ++ )
for (int j = 1; j <= m; j ++ )
{
cin >> s[i][j];
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
}
memset(f, -1, sizeof f); //记忆化搜索
X = (double)s[m][m] / n;
printf("%.3f\n",sqrt(dp(1,1,8,8,n)));
return 0;
}