#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <iterator>      //集合演算(積集合,和集合,差集合など)
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
typedef long long ll;

typedef struct {
    int arr[3];
} xyc;

int main(void) {
    int N;
    cin >> N;

    int aa[500 * 500 + 10];
    for(size_t i = 0; i < N * N; i++) {
        cin >> aa[i];
    }

    int mm[N][N];

    for(size_t i = 0; i < (N + 1) / 2; i++) {
        int j = N - i - 1;
        for(size_t x = i; x <= j; x++) {
            mm[i][x] = i;
            mm[j][x] = i;
            mm[x][i] = i;
            mm[x][j] = i;
        }
    }

    bool is_none[N][N];
    for(size_t i = 0; i < N; i++) {
        for(size_t j = 0; j < N; j++) {
            is_none[i][j] = false;
        }
    }

    // for(size_t i = 0; i < N; i++) {
    //     for(size_t j = 0; j < N; j++) {
    //         cout << mm[j][i] << " ";
    //     }
    //     cout << endl;
    // }

    long long ans = 0;

    for(size_t i = 0; i < N * N; i++) {
        int a = aa[i];
        int x = (a - 1 + N) % N;
        int y = (a - 1) / N;

        // cout << a << " " << x << " " << y << endl;

        ans += mm[y][x];

        is_none[y][x] = true;

        mm[y][x] -= 1;

        queue<xyc> q;
        xyc tmpp = {{x, y, mm[y][x]}};
        q.push(tmpp);

        while(not q.empty()) {
            xyc tmp = q.front();
            q.pop();
            int x0 = tmp.arr[0];
            int y0 = tmp.arr[1];
            int n = tmp.arr[2];

            // cout << x0 << " " << y0 << endl;

            int xx[4] = {x0, x0, x0 + 1, x0 - 1};
            int yy[4] = {y0 + 1, y0 - 1, y0, y0};

            for(size_t k = 0; k < 4; k++) {
                int xt = xx[k];
                int yt = yy[k];
                if(xt < 0 or N <= xt or yt < 0 or N <= yt) {
                    continue;
                }

                if(is_none[yt][xt] == true) {
                    if(mm[yt][xt] > n) {
                        mm[yt][xt] = n;
                        xyc azu = {{xt, yt, mm[yt][xt]}};
                        q.push(azu);
                    }
                } else {
                    if(mm[yt][xt] > n + 1) {
                        mm[yt][xt] = n + 1;
                        xyc azu = {{xt, yt, mm[yt][xt]}};
                        q.push(azu);
                    }
                }
            }
        }

        // for(size_t i = 0; i < N; i++) {
        //     for(size_t j = 0; j < N; j++) {
        //         cout << mm[j][i] << " ";
        //     }
        //     cout << endl;
        // }
        // cout << endl;
    }

    cout << ans << endl;
}


Measured memory_bytes: 5740