#include <bits/stdc++.h>
#pragma GCC optimize("O3")
long mod(long a) {
  long long c = a % (long long)(1e9 + 7);
  if (c >= 0) return c;
  return c + (long long)(1e9 + 7);
}
long long po(long a, long b) {
  if (b == 0) {
    return 1;
  }
  long long z = po(a, b / 2);
  z = mod(z * z);
  if (b % 2 != 0) {
    z = mod(a * z);
  }
  return z;
}
bool prime_(int n) {
  if (n == 1) {
    return false;
  } else if (n == 2) {
    return true;
  } else {
    for (int i = 2; i <= std::sqrt(n); i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}
long long gcd_(long long a, long long b) {
  if (a < b) {
    std::swap(a, b);
  }
  if (a % b == 0) {
    return b;
  } else {
    return gcd_(b, a % b);
  }
}
long long lcm_(long long x, long long y) { return (x / gcd_(x, y)) * y; }
int main() {
  using namespace std;
  int n;
  cin >> n;
  int p[n * n];
  for (int i = 0; i < n * n; i++) {
    cin >> p[i];
    p[i]--;
  }
  auto valid = [&n](int i, int j) -> bool {
    return 0 <= i && i < n && 0 <= j && j < n;
  };
  auto conv = [&n](int i, int j) -> int { return n * i + j; };
  int dist[n][n];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      int x = min(i, n - 1 - i);
      int y = min(j, n - 1 - j);
      dist[i][j] = min(x, y);
    }
  }
  bool exists[n][n];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) exists[i][j] = true;
  int ans = 0;
  int dx[] = {1, 0, -1, 0};
  int dy[] = {0, 1, 0, -1};
  for (int num = 0; num < n * n; num++) {
    int i = num / n;
    int j = num % n;
    exists[i][j] = false;
    ans += dist[i][j];
    priority_queue<pair<int, pair<int, int>>> q;
    q.push(pair<int, pair<int, int>>(-dist[i][j], make_pair(i, j)));
    while (!q.empty()) {
      pair<int, pair<int, int>> p = q.top();
      q.pop();
      int x = p.second.first, y = p.second.second;
      for (int k = 0; k < 4; k++) {
        int nx = x + dx[k], ny = y + dy[k];
        if (!valid(nx, ny)) continue;
        if (exists[x][y]) {
          if (dist[x][y] + 1 < dist[nx][ny]) {
            dist[nx][ny] = dist[x][y] + 1;
            q.push(pair<int, pair<int, int>>(-dist[nx][ny], make_pair(nx, ny)));
          }
        } else {
          if (dist[x][y] < dist[nx][ny]) {
            dist[nx][ny] = dist[x][y];
            q.push(pair<int, pair<int, int>>(-dist[nx][ny], make_pair(nx, ny)));
          }
        }
      }
    }
  }
  cout << ans << endl;
  return 0;
}
