#include <bits/stdc++.h>
using namespace std;
bool used[10][10][3];
pair<int, int> d[10][10][3], a[100];
int n, dx[8] = {2, -2, 2, -2, 1, -1, 1, -1},
       dy[8] = {1, 1, -1, -1, 2, 2, -2, -2};
bool inf(int x, int y) { return (x >= 0 && y >= 0 && x < n && y < n); }
int main() {
  vector<vector<int> > temp;
  queue<vector<int> > q;
  int x, y, t, b, c, k;
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> x;
      a[x - 1] = {i, j};
    }
  }
  x = a[0].first;
  y = a[0].second;
  d[x][y][0] = {0, 0};
  d[x][y][1] = {0, 0};
  d[x][y][2] = {0, 0};
  used[x][y][0] = true;
  used[x][y][1] = true;
  used[x][y][2] = true;
  for (int i = 0; i < n * n - 1; i++) {
    x = a[i].first;
    y = a[i].second;
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 3; k++) {
        if (d[x][y][j].first > d[x][y][k].first + 1 ||
            (d[x][y][j].first == d[x][y][k].first + 1 &&
             d[x][y][j].second > d[x][y][k].second + 1))
          d[x][y][j] = {d[x][y][k].first + 1, d[x][y][k].second + 1};
      }
    }
    temp.clear();
    temp.push_back({d[x][y][0].first, d[x][y][0].second, 0});
    temp.push_back({d[x][y][1].first, d[x][y][1].second, 1});
    temp.push_back({d[x][y][2].first, d[x][y][2].second, 2});
    sort(temp.begin(), temp.end());
    q.push({x, y, temp[0][2]});
    q.push({x, y, temp[1][2]});
    q.push({x, y, temp[2][2]});
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        used[j][k][0] = false;
        used[j][k][1] = false;
        used[j][k][2] = false;
      }
    }
    used[x][y][0] = true;
    used[x][y][1] = true;
    used[x][y][2] = true;
    while (!q.empty()) {
      x = q.front()[0];
      y = q.front()[1];
      k = q.front()[2];
      q.pop();
      for (int j = 0; j < 3; j++) {
        if (!used[x][y][j]) {
          used[x][y][j] = true;
          q.push({x, y, j});
          d[x][y][j] = {d[x][y][k].first + 1, d[x][y][k].second + 1};
        } else if (d[x][y][j].first > d[x][y][k].first + 1 ||
                   (d[x][y][j].first == d[x][y][k].first + 1 &&
                    d[x][y][j].second > d[x][y][k].second + 1))
          d[x][y][j] = {d[x][y][k].first + 1, d[x][y][k].second + 1};
      }
      if (k == 0) {
        for (int j = 0; j < n; j++) {
          if (!used[x][j][0]) {
            used[x][j][0] = true;
            q.push({x, j, 0});
            d[x][j][0] = {d[x][y][k].first + 1, d[x][y][k].second};
          } else if ((d[x][j][0].first > d[x][y][k].first + 1) ||
                     (d[x][j][0].first == d[x][y][k].first + 1 &&
                      d[x][j][0].second > d[x][y][k].second))
            d[x][j][0] = {d[x][y][k].first + 1, d[x][y][k].second};
        }
        for (int j = 0; j < n; j++) {
          if (!used[j][y][0]) {
            used[j][y][0] = true;
            q.push({j, y, 0});
            d[j][y][0] = {d[x][y][k].first + 1, d[x][y][k].second};
          } else if ((d[j][y][0].first > d[x][y][k].first + 1) ||
                     (d[j][y][0].first == d[x][y][k].first + 1 &&
                      d[j][y][0].second > d[x][y][k].second))
            d[j][y][0] = {d[x][y][k].first + 1, d[x][y][k].second};
        }
      } else if (k == 1) {
        for (int j = 0; j < n; j++) {
          t = x + y - j;
          if (!inf(t, j)) continue;
          if (!used[t][j][1]) {
            used[t][j][1] = true;
            q.push({t, j, 1});
            d[t][j][1] = {d[x][y][k].first + 1, d[x][y][k].second};
          } else if ((d[t][j][1].first > d[x][y][k].first + 1) ||
                     (d[t][j][1].first == d[x][y][k].first + 1 &&
                      d[t][j][1].second > d[x][y][k].second))
            d[t][j][1] = {d[x][y][k].first + 1, d[x][y][k].second};
        }
        for (int j = 0; j < n; j++) {
          t = y - x + j;
          if (!inf(t, j)) continue;
          if (!used[j][t][1]) {
            used[j][t][1] = true;
            q.push({j, t, 1});
            d[j][t][1] = {d[x][y][k].first + 1, d[x][y][k].second};
          } else if ((d[j][t][1].first > d[x][y][k].first + 1) ||
                     (d[j][t][1].first == d[x][y][k].first + 1 &&
                      d[j][t][1].second > d[x][y][k].second))
            d[j][t][1] = {d[x][y][k].first + 1, d[x][y][k].second};
        }
      } else {
        for (int j = 0; j < 8; j++) {
          if (!inf(x + dx[j], y + dy[j])) continue;
          if (!used[x + dx[j]][y + dy[j]][2]) {
            used[x + dx[j]][y + dy[j]][2] = true;
            q.push({x + dx[j], y + dy[j], 2});
            d[x + dx[j]][y + dy[j]][2] = {d[x][y][k].first + 1,
                                          d[x][y][k].second};
          } else if ((d[x + dx[j]][y + dy[j]][2].first >
                      d[x][y][k].first + 1) ||
                     (d[x + dx[j]][y + dy[j]][2].first ==
                          d[x][y][k].first + 1 &&
                      d[x + dx[j]][y + dy[j]][2].second > d[x][y][k].second))
            d[x + dx[j]][y + dy[j]][2] = {d[x][y][k].first + 1,
                                          d[x][y][k].second};
        }
      }
    }
  }
  x = a[n * n - 1].first;
  y = a[n * n - 1].second;
  b = d[x][y][0].first;
  c = d[x][y][0].second;
  if ((d[x][y][1].first < b) ||
      (d[x][y][1].first == b && d[x][y][1].second < c)) {
    if (used[x][y][1]) {
      b = d[x][y][1].first;
      c = d[x][y][1].second;
    }
  }
  if ((d[x][y][2].first < b) ||
      (d[x][y][2].first == b && d[x][y][2].second < c)) {
    if (used[x][y][2]) {
      b = d[x][y][2].first;
      c = d[x][y][2].second;
    }
  }
  cout << b << " " << c;
}
