// $%U%$ $%Y%$-$%M%$-$%D%$ $%h%$:$%m%$

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MN = 511;
const int inf = 10000000;

#define mid ((L+R)>>1)
struct node{
	int v;
	node * l;
	node * r;
} nodes[40000000];
int _cnt;
node* newnode(int v){
	nodes[_cnt].v=v;
	return nodes+(_cnt++);
}
struct st{
	node * root;
	node* _update(node* p, int L, int R, int i, int v){
		if(!p)p=newnode(v);
		p->v=min(p->v,v);
		if(R<=L)
			return p;
		if(i>mid)p->r=_update(p->r,mid+1,R,i,v);
		else p->l=_update(p->l,L,mid,i,v);
		return p;
	}
	int _rmq(node *p, int L, int R, int l, int r){
		if(!p||L>r||R<l)return inf;
		if(L>=l&&R<=r)return p->v;
		return min(_rmq(p->l,L,mid,l,r),_rmq(p->r,mid+1,R,l,r));
	}
	void update(int i, int v){
		root=_update(root,0,MN,i,v);
	}
	int rmq(int l, int r){
		return _rmq(root,0,MN,l,r);
	}
};
#define son (p<<1)
struct st2{
	st rt[(1+MN)*4];
	void _update(int p, int L, int R, int i, int j, int v){
		rt[p].update(j,v);
		if(R<=L){
			return;
		}
		if(i>mid) _update(son+1,mid+1,R,i,j,v);
		else _update(son,L,mid,i,j,v);
	}
	int _rmq(int p, int L, int R, int l1, int r1, int l2, int r2){
		if(L>r1||R<l1)return inf;
		if(L>=l1&&R<=r1)return rt[p].rmq(l2,r2);
		return min(_rmq(son,L,mid,l1,r1,l2,r2),_rmq(son+1,mid+1,R,l1,r1,l2,r2));
	}
	void update(int i, int j, int v){
		_update(1,0,MN,i,j,v);
	}
	int rmq(int l1, int r1, int l2, int r2){
		return _rmq(1,0,MN,l1,r1,l2,r2);
	}
};

int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	int n;
	cin>>n;
	int m=n*n;
	st2 ul,ur,bl,br;
	int ans=0;
	while(m--){
		int p;
		cin>>p;
		p--;
		int x=p/n;
		int y=p%n;
		int res=min(min(x,y),min(n-x-1,n-y-1));
		int t=ul.rmq(0,x,0,y);
		res=min(res,x+y+t-1);
		t=ur.rmq(x,n,0,y);
		res=min(res,-x+y+t-1);
		t=br.rmq(x,n,y,n);
		res=min(res,-x-y+t-1);
		t=bl.rmq(0,x,y,n);
		res=min(res,x-y+t-1);
		ans+=res;
		ul.update(x,y,res-x-y);
		ur.update(x,y,res+x-y);
		br.update(x,y,res+x+y);
		bl.update(x,y,res-x+y);
	}
	cout<<ans<<endl;
	return 0;
}

