#include<cstdio>
#include<cstring>
#include<queue>
const int maxn=310;
using namespace std;
struct point{
    int x,y;
    int step;
};//到达的点,和需要的步数 
int dx[8]={-2,-2,-1,-1,1,1,2,2};
int dy[8]={1,-1,2,-2,2,-2,1,-1};
//int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
bool vis[maxn][maxn];
int sx,sy,ex,ey,tx,ty,L;
int bfs(){
    if(sx==ex&&sy==ey) return 0;
    memset(vis,false,sizeof(vis));//初始化 
    queue<point>Q;//定义个队列 
    point start,node;
    start.x=sx;
    start.y=sy;
    start.step=0;//队列初始化 
    Q.push(start);//压进队列
    int step,x,y;
    while(!Q.empty()){
        start=Q.front(),Q.pop();//取队列的头元素,同时把这个元素弹出 (队列从后往前进,先进的先出)
        x=start.x;
        y=start.y;
        step=start.step;//把队列头元素的x,y,step取出 
        for(int i=0;i<8;i++){//扩展 
            tx=x+dx[i];
            ty=y+dy[i];
            if(tx==ex&&ty==ey) return step+1;
            if(tx>=0&&tx<L&&ty>=0&&ty<L&&!vis[tx][ty]){
                node.x=tx;
                node.y=ty;
                node.step=step+1;
                Q.push(node);//满足条件的进队列 
                vis[tx][ty]=true;
            }
        }
    }
}
int main(){
    int N;
    scanf("%d",&N);
    while(N--){
        scanf("%d",&L);
        scanf("%d%d",&sx,&sy);
        scanf("%d%d",&ex,&ey);
        printf("%d\n",bfs());
    }
    return 0; 
}