#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
template <class T>
bool chmax(T& a, const T& b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T& a, const T& b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2>& l, const pair<T1, T2>& r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2>& l, const pair<T1, T2>& r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
const lint MOD = 1e9 + 7;
lint score[500][500], N;
bool isexist[500][500];
lint arr[250000];
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cin >> N;
  for (lint i = (0), i_end_ = (N * N); i < i_end_; i++) {
    cin >> arr[i];
    arr[i]--;
  }
  for (lint i = (0), i_end_ = (N); i < i_end_; i++) {
    for (lint j = (0), j_end_ = (N); j < j_end_; j++) {
      score[i][j] = min(min(i, N - i - 1), min(j, N - j - 1));
      isexist[i][j] = true;
    }
  }
  lint cnt = 0;
  lint dx[4] = {0, -1, 0, 1}, dy[4] = {1, 0, -1, 0};
  for (lint i = (0), i_end_ = (N * N); i < i_end_; i++) {
    lint row = arr[i] / N, col = arr[i] % N;
    cnt += score[row][col];
    queue<plint> que;
    que.push(plint(row, col));
    isexist[row][col] = false;
    while (!que.empty()) {
      plint curr = que.front();
      que.pop();
      lint y = curr.first, x = curr.second;
      for (lint i = (0), i_end_ = (4); i < i_end_; i++) {
        lint nextx = x + dx[i], nexty = y + dy[i];
        if (0 <= nexty && nexty < N && 0 <= nextx && nextx < N &&
            ((isexist[y][x] && score[nexty][nextx] == score[y][x] + 1) ||
             (!isexist[y][x] && score[nexty][nextx] > score[y][x]))) {
          if (!isexist[y][x]) score[nexty][nextx] = score[y][x];
          que.push(plint(nexty, nextx));
        }
      }
    }
  }
  cout << cnt;
}
