#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 d[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int N = 500;
bool visit[N][N];
int dp[N][N], h[N][N];
int n;
int solve(int x, int y) {
  deque<pair<int, int> > Q;
  dp[x][y] = 0;
  Q.push_back({x, y});
  vector<pair<int, int> > footprint;
  int ret = INF;
  while (!Q.empty()) {
    int x = Q.front().first, y = Q.front().second;
    Q.pop_front();
    footprint.push_back({x, y});
    if (x == 0 || x == n - 1 || y == 0 || y == n - 1) {
      ret = min(ret, dp[x][y]);
    }
    for (int k = 0; k < 4; ++k) {
      int nx = x + d[k][0];
      int ny = y + d[k][1];
      if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
      if (visit[nx][ny]) {
        if (dp[nx][ny] > dp[x][y]) {
          dp[nx][ny] = dp[x][y];
          Q.push_front({nx, ny});
        }
      } else {
        if (dp[nx][ny] > dp[x][y] + 1) {
          dp[nx][ny] = dp[x][y] + 1;
          Q.push_back({nx, ny});
        }
      }
    }
  }
  for (auto& p : footprint) {
    int x = p.first, y = p.second;
    dp[x][y] = INF;
  }
  return ret;
}
int main() {
  scanf("%d", &n);
  long long ret = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      dp[i][j] = INF;
    }
  }
  for (int i = 0; i < n * n; ++i) {
    int pos;
    scanf("%d", &pos);
    --pos;
    int x = pos / n, y = pos % n;
    int cur = solve(x, y);
    ret += cur;
    visit[x][y] = true;
  }
  printf("%lld\n", ret);
  return 0;
}
