#include <bits/stdc++.h>
using namespace std;
template <typename A, typename B>
ostream& operator<<(ostream& out, const pair<A, B>& a) {
  out << "(" << a.first << "," << a.second << ")";
  return out;
}
template <typename T, size_t N>
ostream& operator<<(ostream& out, const array<T, N>& a) {
  out << "[";
  bool first = true;
  for (auto& v : a) {
    out << (first ? "" : ", ");
    out << v;
    first = 0;
  }
  out << "]";
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& a) {
  out << "[";
  bool first = true;
  for (auto& v : a) {
    out << (first ? "" : ", ");
    out << v;
    first = 0;
  }
  out << "]";
  return out;
}
template <typename T, class Cmp>
ostream& operator<<(ostream& out, const set<T, Cmp>& a) {
  out << "{";
  bool first = true;
  for (auto& v : a) {
    out << (first ? "" : ", ");
    out << v;
    first = 0;
  }
  out << "}";
  return out;
}
template <typename U, typename T, class Cmp>
ostream& operator<<(ostream& out, const map<U, T, Cmp>& a) {
  out << "{";
  bool first = true;
  for (auto& p : a) {
    out << (first ? "" : ", ");
    out << p.first << ":" << p.second;
    first = 0;
  }
  out << "}";
  return out;
}
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << ": " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << ": " << arg1 << " |";
  __f(comma + 1, args...);
}
const int INF = 1 << 29;
const int MOD = 1e9 + 7;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand() % x; }
struct fast_ios {
  fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
  };
} fast_ios_;
const int dir[5][2] = {{0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int N = 500 + 10;
int f[N * N], c[N * N];
bool visit[N][N];
int find(int x) {
  if (f[x] != f[f[x]]) f[x] = find(f[x]);
  return f[x];
}
void join(int x, int y) {
  int rx = find(x), ry = find(y);
  if (rx == ry) return;
  f[ry] = rx;
  c[rx] = min(c[rx], c[ry]);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n * n; ++i) {
    int x = i / n, y = i % n;
    f[i] = i;
    c[i] = min(min(x, y), min(n - 1 - x, n - 1 - y));
  }
  long long ret = 0;
  for (int i = 0; i < n * n; ++i) {
    int pos;
    scanf("%d", &pos);
    --pos;
    int x = pos / n, y = pos % n;
    int cur = c[pos];
    for (int k = 1; k <= 4; ++k) {
      int nx = x + dir[k][0];
      int ny = y + dir[k][1];
      if (nx < 0 || nx >= n || ny < 0 || ny >= n || !visit[nx][ny]) continue;
      cur = min(cur, c[find(nx * n + ny)]);
    }
    ret += cur;
    visit[x][y] = true;
    for (int k = 1; k <= 4; ++k) {
      int nx = x + dir[k][0];
      int ny = y + dir[k][1];
      if (nx < 0 || nx >= n || ny < 0 || ny >= n || !visit[nx][ny]) continue;
      join(x * n + y, nx * n + ny);
    }
  }
  printf("%lld\n", ret);
  return 0;
}
