//int n;
//void g(int r, int c, int x, vvi &d, vvi &occ){
//    if(d[r][c] <= x)
//        return;
//    d[r][c] = x;
//    if(r)
//        g(r-1,c,x+occ[r][c],d,occ);
//    if(r+1 < n)
//        g(r+1,c,x+occ[r][c],d,occ);
//    if(c)
//        g(r,c-1,x+occ[r][c],d,occ);
//    if(c+1 < n)
//        g(r,c+1,x+occ[r][c],d,occ);
//}
//int f(int r, int c, vvi &d, vvi &occ){
//    occ[r][c] = 0;
//    int ans = d[r][c];
//    if(r)
//        g(r-1,c,ans,d,occ);
//    if(r+1 < n)
//        g(r+1,c,ans,d,occ);
//    if(c)
//        g(r,c-1,ans,d,occ);
//    if(c+1 < n)
//        g(r,c+1,ans,d,occ);
//    return ans;
//}
//void __(){
//    cin >> n;
//    vi p(n*n);
//    cin >> p;
//    for(int &x : p)
//        --x;
//    vvi d(n,vi(n,n));
//    vvi occ(n,vi(n,1));
//    rep(i,n){
//        rep(j,n){
//            d[i][j] = min(vi{i,j,n-1-i,n-1-j});
//        }
//    }
//    int ans = 0;
//    for(int x : p){
//        ans += f(x/n,x%n,d,occ);
//    }
//    print ans;
//}
#include <iomanip>
#include <algorithm>
#include <cassert>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define REP_ZERO_INT(i,r) for(int i = 0; i < (r); ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT,REP_ZERO_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
T1 istream& operator>>(istream& stream, vector<T>& t){
    return read(all(t), stream);
}
T1 istream& read(T b, T e, istream& stream){
    for(T it = b; it != e; ++it)
        stream >> *it;
    return stream;
}
T1 T min(const vector<T>& arr){
    assert(!arr.empty());
    T ans = arr[0];
    for(auto& cur : arr)
        ans = min(ans, cur);
    return ans;
}
struct _print {
    string sep,end;
    bool space;
    ostream &stream;
    _print(string _sep=" ",string _end="\n",
            ostream &_stream = cout) 
        : sep(_sep),end(_end),space(false),
            stream(_stream) {}
    ~_print() { stream << end; }

    template <typename T>
        _print &operator , (const T &t) {
            if (space) stream << sep;
            space = true;
            stream << t;
            return *this;
        }
};
#define print _print(),
int n;
void g(int r, int c, int x, vvi &d, vvi &occ){
    if(d[r][c] <= x)
        return;
    d[r][c] = x;
    if(r)
        g(r-1,c,x+occ[r][c],d,occ);
    if(r+1 < n)
        g(r+1,c,x+occ[r][c],d,occ);
    if(c)
        g(r,c-1,x+occ[r][c],d,occ);
    if(c+1 < n)
        g(r,c+1,x+occ[r][c],d,occ);
}
int f(int r, int c, vvi &d, vvi &occ){
    occ[r][c] = 0;
    int ans = d[r][c];
    if(r)
        g(r-1,c,ans,d,occ);
    if(r+1 < n)
        g(r+1,c,ans,d,occ);
    if(c)
        g(r,c-1,ans,d,occ);
    if(c+1 < n)
        g(r,c+1,ans,d,occ);
    return ans;
}
void __(){
    cin >> n;
    vi p(n*n);
    cin >> p;
    for(int &x : p)
        --x;
    vvi d(n,vi(n,n));
    vvi occ(n,vi(n,1));
    rep(i,n){
        rep(j,n){
            d[i][j] = min(vi{i,j,n-1-i,n-1-j});
        }
    }
    int ans = 0;
    for(int x : p){
        ans += f(x/n,x%n,d,occ);
    }
    print ans;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        __();
}



Measured memory_bytes: 24956