/**   Created by: Humberto Yusta
          Codeforces User: humbertoyusta
          Country: Cuba
          Copyright��                    */
#include<bits/stdc++.h>
using namespace std;
/// Macros:
#define int long long
#define f first
#define s second
#define db(x) cerr << #x << ": " << (x) << '\n';
#define pb push_back
#define lb lower_bound
#define up upper_bound
#define all(x) x.begin() , x.end()
#define rall(x) x.rbegin() , x.rend()
#define enl '\n'
typedef pair<int,int> ii;
typedef long double ld;
typedef unsigned long long ull;
/// Constraints:
const int maxn = 505;
const int mod = 1000000000;
const ld eps = 1e-9;
const int inf = ((1ll<<31ll)-1ll);
const int INF = 10000000000000000ll;
const ld pi = acos(-1);
/// Prime Numbers:
// 2, 173, 179, 181, 197, 311, 331, 737, 1009, 2011, 2027, 3079, 4001, 10037, 10079, 20011, 20089;
// 100003, 100019, 100043, 200003, 200017, 1000003, 1000033, 1000037, 1000081;
// 2000003, 2000029, 2000039, 1000000007, 1000000021, 2000000099;
/// Functions:
#define lg2(x) 31 - __builtin_clz(x)
#define lgx(x,b) ( log(x) / log(b) )
/// Red-Black Tree Template ---------------------------------
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//typedef tree < long long ,  null_type ,  less<long long> ,  rb_tree_tag ,  tree_order_statistics_node_update > ordered_set;
/// Quick Pow------------------------------------------------
int qpow(int b,int e){
    if( !e ) return 1;
    if( e & 1 ) return qpow(b,e-1) * b;
    int pwur = qpow(b,e>>1);
    return pwur * pwur;
}
int modinv(int x){
    return qpow(x,mod-2);
}
/// My Code -------------------------------------------------

int a[maxn][maxn], dist[maxn][maxn], id[maxn*maxn], n;
deque<ii> q;
ii mv[4] = { {1,0} , {-1,0} , {0,1} , {0,-1} };

void bfs(int u,int v, int c){
    q.push_back({u,v});
    while( !q.empty() ){
        int u = q.front().f;
        int v = q.front().s;//db(u)db(v)
        q.pop_front();
        for(int i=0; i<4; i++){
            if( u+mv[i].f <= 0 || u+mv[i].f >= n+1 ) continue;
            if( v+mv[i].s <= 0 || v+mv[i].s >= n+1 ) continue;
            if( dist[u+mv[i].f][v+mv[i].s] > dist[u][v] + ( a[u+mv[i].f][v+mv[i].s] > c ) ){
                dist[u+mv[i].f][v+mv[i].s] = dist[u][v] + ( a[u+mv[i].f][v+mv[i].s] > c );
                if( a[u+mv[i].f][v+mv[i].s] > c ) q.push_back({u+mv[i].f,v+mv[i].s});
                    else q.push_front({u+mv[i].f,v+mv[i].s});
            }
        }
    }
}

int32_t main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cout.setf(ios::fixed); cout.precision(0);
    srand(time(NULL));

    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);

    cin >> n;

    for(int i=0; i<=n+1; i++)
        for(int j=0; j<=n+1; j++){
            a[i][j] = mod;
            dist[i][j] = mod;
        }

    for(int i=1; i<=n*n; i++){
        int u;
        cin >> u;
        u--;
        a[u/n+1][u%n+1] = i;
        id[i] = u;
    }

    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            //cout << a[i][j] << ' ';
            dist[i][j] = min( min( i , n - i + 1 ) , min( j , n - j + 1 ) );
        }//cout << '\n';
    }

    int ans = 0;
    for(int i=1; i<=n*n; i++){
        int u = id[i] / n + 1;
        int v = id[i] % n + 1;
        //cout<<'\n';
        //for(int i=1; i<=n; i++){
        //    for(int j=1; j<=n; j++){
        //        cout << dist[i][j] << ' ';
        //    }cout << '\n';
        //}
        dist[u][v]--;
        ans += dist[u][v];
        bfs(u,v,i);
    }
    cout << ans << '\n';

    return 0;
}


Measured memory_bytes: 11540