#include <bits/stdc++.h>
using namespace std;
const int N = 20;
const int dx[] = {1, 1, -1, -1, 2, 2, -2, -2};
const int dy[] = {2, -2, 2, -2, 1, -1, 1, -1};
struct rec {
  int x, y, t;
} a[N * N], q[N * N];
pair<int, int> dis[N][N][3], f[N * N][3];
bool exist[N][N][3];
int n;
void search(int k) {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      for (int k = 0; k < 3; k++) dis[i][j][k] = make_pair(1000, 0);
  for (int j = 0; j < 3; j++) dis[a[k].x][a[k].y][j] = f[k][j];
  q[1] = rec{a[k].x, a[k].y, 0};
  q[2] = rec{a[k].x, a[k].y, 1};
  q[3] = rec{a[k].x, a[k].y, 2};
  exist[a[k].x][a[k].y][0] = true;
  exist[a[k].x][a[k].y][1] = true;
  exist[a[k].x][a[k].y][2] = true;
  int l = 1;
  int r = 3;
  while (l <= r) {
    int x = q[l].x;
    int y = q[l].y;
    int t = q[l].t;
    l++;
    exist[x][y][t] = false;
    for (int j = 0; j < 3; j++)
      if (j != t) {
        if (dis[x][y][j] >
            make_pair(dis[x][y][t].first + 1, dis[x][y][t].second + 1)) {
          dis[x][y][j] =
              make_pair(dis[x][y][t].first + 1, dis[x][y][t].second + 1);
          if (!exist[x][y][j]) {
            q[++r] = rec{x, y, j};
            exist[x][y][j] = true;
          }
        }
      }
    if (t == 0) {
      for (int i = 1; i <= n; i++)
        if (dis[i][y][t] >
            make_pair(dis[x][y][t].first + 1, dis[x][y][t].second)) {
          dis[i][y][t] = make_pair(dis[x][y][t].first + 1, dis[x][y][t].second);
          if (!exist[i][y][t]) {
            q[++r] = rec{i, y, t};
            exist[i][y][t] = true;
          }
        }
      for (int i = 1; i <= n; i++)
        if (dis[x][i][t] >
            make_pair(dis[x][y][t].first + 1, dis[x][y][t].second)) {
          dis[x][i][t] = make_pair(dis[x][y][t].first + 1, dis[x][y][t].second);
          if (!exist[x][i][t]) {
            q[++r] = rec{x, i, t};
            exist[x][i][t] = true;
          }
        }
    }
    if (t == 1) {
      for (int i = -n; i <= n; i++)
        if (1 <= x + i && x + i <= n && 1 <= y + i && y + i <= n)
          if (dis[x + i][y + i][t] >
              make_pair(dis[x][y][t].first + 1, dis[x][y][t].second)) {
            dis[x + i][y + i][t] =
                make_pair(dis[x][y][t].first + 1, dis[x][y][t].second);
            if (!exist[x + i][y + i][t]) {
              q[++r] = rec{x + i, y + i, t};
              exist[x + i][y + i][t] = true;
            }
          }
      for (int i = -n; i <= n; i++)
        if (1 <= x + i && x + i <= n && 1 <= y - i && y - i <= n)
          if (dis[x + i][y - i][t] >
              make_pair(dis[x][y][t].first + 1, dis[x][y][t].second)) {
            dis[x + i][y - i][t] =
                make_pair(dis[x][y][t].first + 1, dis[x][y][t].second);
            if (!exist[x + i][y - i][t]) {
              q[++r] = rec{x + i, y - i, t};
              exist[x + i][y - i][t] = true;
            }
          }
    }
    if (t == 2) {
      for (int k = 0; k < 8; k++)
        if (1 <= x + dx[k] && x + dx[k] <= n && 1 <= y + dy[k] &&
            y + dy[k] <= n)
          if (dis[x + dx[k]][y + dy[k]][t] >
              make_pair(dis[x][y][t].first + 1, dis[x][y][t].second)) {
            dis[x + dx[k]][y + dy[k]][t] =
                make_pair(dis[x][y][t].first + 1, dis[x][y][t].second);
            if (!exist[x + dx[k]][y + dy[k]][t]) {
              q[++r] = rec{x + dx[k], y + dy[k], t};
              exist[x + dx[k]][y + dy[k]][t] = true;
            }
          }
    }
  }
  for (int j = 0; j < 3; j++) f[k + 1][j] = dis[a[k + 1].x][a[k + 1].y][j];
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      int x;
      scanf("%d", &x);
      a[x].x = i;
      a[x].y = j;
    }
  for (int i = 1; i <= n; i++)
    for (int t = 0; t < 3; t++) f[i][t].first = 1000;
  for (int j = 0; j < 3; j++) f[1][j] = make_pair(0, 0);
  for (int i = 1; i < n * n; i++) {
    search(i);
  }
  pair<int, int> x = min(min(f[n * n][0], f[n * n][1]), f[n * n][2]);
  printf("%d %d\n", x.first, x.second);
}
