#include <bits/stdc++.h>
using namespace std;
int bishopx[] = {1, 1, -1, -1};
int bishopy[] = {1, -1, -1, 1};
int caballox[] = {2, 1, -1, -2, -2, -1, 1, 2};
int caballoy[] = {1, 2, 2, 1, -1, -2, -2, -1};
int rocky[] = {1, 0, -1, 0};
int rockx[] = {0, 1, 0, -1};
pair<int, int> dp[11][11][5][120];
struct nodo {
  int posy, posx, tipo, llegada;
  nodo() {}
  nodo(int yy, int xx, int tip, int lleg) {
    posy = yy;
    posx = xx;
    tipo = tip;
    llegada = lleg;
  }
  bool operator<(const nodo &refe) const {
    return dp[posy][posx][tipo][llegada] >
           dp[refe.posy][refe.posx][refe.tipo][refe.llegada];
  }
};
int val[100][100];
int n;
bool valid(int posy, int posx) {
  if (posy >= n || posx >= n || posy < 0 || posx < 0) return false;
  return true;
}
void clr() {
  for (int i = 0; i < 11; ++i)
    for (int j = 0; j < 11; j++)
      for (int k = 0; k < 5; k++)
        for (int l = 0; l < 120; l++)
          dp[i][j][k][l] = pair<int, int>(1000000, 1000000);
}
int main() {
  clr();
  cin >> n;
  int posx, posy, posfx, posfy;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; j++) {
      cin >> val[i][j];
      if (val[i][j] == 1) {
        posx = j;
        posy = i;
      }
      if (val[i][j] == n * n) {
        posfx = j;
        posfy = i;
      }
    }
  }
  priority_queue<nodo> cola;
  for (int i = 0; i < 3; ++i) {
    dp[posy][posx][i][1] = pair<int, int>(0, 0);
    cola.push(nodo(posy, posx, i, 1));
  }
  while (!cola.empty()) {
    nodo num = cola.top();
    cola.pop();
    int posx = num.posx;
    int posy = num.posy;
    int tipo = num.tipo;
    int llegada = num.llegada;
    int yy, xx;
    if (posy == posfy && posx == posfx && llegada == n * n) {
      cout << dp[posy][posx][tipo][llegada].first << " "
           << dp[posy][posx][tipo][llegada].second << endl;
      return 0;
    }
    if (tipo == 0) {
      for (int i = 0; i < 8; ++i) {
        yy = posy + caballoy[i];
        xx = posx + caballox[i];
        if (valid(yy, xx) == false) continue;
        int valllegada = llegada;
        if (val[yy][xx] == llegada + 1) valllegada++;
        if (dp[yy][xx][tipo][valllegada] >
            pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                           dp[posy][posx][tipo][llegada].second)) {
          dp[yy][xx][tipo][valllegada] =
              pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                             dp[posy][posx][tipo][llegada].second);
          cola.push(nodo(yy, xx, tipo, valllegada));
        }
      }
    }
    if (tipo == 1) {
      for (int i = 1; i <= n; ++i) {
        for (int j = 0; j < 4; j++) {
          yy = posy + bishopy[j] * i;
          xx = posx + bishopx[j] * i;
          if (valid(yy, xx) == false) continue;
          int valllegada = llegada;
          if (val[yy][xx] == llegada + 1) valllegada++;
          if (dp[yy][xx][tipo][valllegada] >
              pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                             dp[posy][posx][tipo][llegada].second)) {
            dp[yy][xx][tipo][valllegada] =
                pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                               dp[posy][posx][tipo][llegada].second);
            cola.push(nodo(yy, xx, tipo, valllegada));
          }
        }
      }
    }
    if (tipo == 2) {
      for (int i = 1; i <= n; ++i) {
        for (int j = 0; j < 4; j++) {
          yy = posy + rocky[j] * i;
          xx = posx + rockx[j] * i;
          if (valid(yy, xx) == false) continue;
          int valllegada = llegada;
          if (val[yy][xx] == llegada + 1) valllegada++;
          if (dp[yy][xx][tipo][valllegada] >
              pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                             dp[posy][posx][tipo][llegada].second)) {
            dp[yy][xx][tipo][valllegada] =
                pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                               dp[posy][posx][tipo][llegada].second);
            cola.push(nodo(yy, xx, tipo, valllegada));
          }
        }
      }
    }
    for (int tipos = 0; tipos < 3; tipos++) {
      if (tipos == tipo) continue;
      int valllegada = llegada;
      if (val[posy][posx] == llegada + 1) valllegada++;
      if (dp[posy][posx][tipos][valllegada] >
          pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                         dp[posy][posx][tipo][llegada].second + 1)) {
        dp[posy][posx][tipos][valllegada] =
            pair<int, int>(dp[posy][posx][tipo][llegada].first + 1,
                           dp[posy][posx][tipo][llegada].second + 1);
        cola.push(nodo(posy, posx, tipos, valllegada));
      }
    }
  }
}
