#include <bits/stdc++.h>
using namespace std;
int minHates(const vector<vector<int> >& seats, int startr, int startc,
             vector<vector<int> >& hates) {
  int N = seats.size();
  if (startr == 0 || startr == N - 1 || startc == 0 || startc == N - 1) {
    return 0;
  }
  if (hates[startr + 1][startc] == 0 || hates[startr - 1][startc] == 0 ||
      hates[startr][startc + 1] == 0 || hates[startr][startc - 1] == 0) {
    return 0;
  }
  queue<int> que;
  vector<vector<int> > arrived(N, vector<int>(N, 0));
  queue<pair<int, int> > nextSearch;
  list<pair<int, int> > forUpdate;
  nextSearch.push(make_pair(startr, startc));
  arrived[startr][startc] = 1;
  for (int nbHates = 0; nbHates < N; ++nbHates) {
    queue<pair<int, int> > que = nextSearch;
    queue<pair<int, int> >().swap(nextSearch);
    while (!que.empty()) {
      int r = que.front().first;
      int c = que.front().second;
      que.pop();
      if (r == 0 || r == N - 1 || c == 0 || c == N - 1 || hates[r][c] == 0) {
        for (auto e : forUpdate) {
          hates[e.first][e.second] = nbHates;
        }
        return nbHates;
      }
      if (arrived[r + 1][c] == 0) {
        arrived[r + 1][c] = 1;
        (seats[r + 1][c] == 0 ? que : nextSearch).push(make_pair(r + 1, c));
        if (nbHates == 0 && seats[r + 1][c] == 0) {
          forUpdate.push_back(make_pair(r + 1, c));
        }
      }
      if (arrived[r - 1][c] == 0) {
        arrived[r - 1][c] = 1;
        (seats[r - 1][c] == 0 ? que : nextSearch).push(make_pair(r - 1, c));
        if (nbHates == 0 && seats[r - 1][c] == 0) {
          forUpdate.push_back(make_pair(r - 1, c));
        }
      }
      if (arrived[r][c + 1] == 0) {
        arrived[r][c + 1] = 1;
        (seats[r][c + 1] == 0 ? que : nextSearch).push(make_pair(r, c + 1));
        if (nbHates == 0 && seats[r][c + 1] == 0) {
          forUpdate.push_back(make_pair(r, c + 1));
        }
      }
      if (arrived[r][c - 1] == 0) {
        arrived[r][c - 1] = 1;
        (seats[r][c - 1] == 0 ? que : nextSearch).push(make_pair(r, c - 1));
        if (nbHates == 0 && seats[r][c - 1] == 0) {
          forUpdate.push_back(make_pair(r, c - 1));
        }
      }
    }
  }
}
void Main() {
  int N;
  cin >> N;
  int N2 = N * N;
  vector<int> P(N2, 0);
  for (int i = 0; i < N2; ++i) {
    cin >> P[i];
    P[i] -= 1;
  }
  int ans = 0;
  vector<vector<int> > seats(N, vector<int>(N, 1));
  vector<vector<int> > hates(N, vector<int>(N, -1));
  for (int i = 0; i < N2; ++i) {
    int p = P[i];
    int r = p / N;
    int c = p % N;
    seats[r][c] = 0;
    int h = minHates(seats, r, c, hates);
    hates[r][c] = h;
    ans += h;
  }
  cout << ans << endl;
}
int main() {
  std::cout << std::fixed << std::setprecision(15);
  Main();
  return 0;
}
