#include<iostream>
#include<queue>
using namespace std;
queue<int>q;
int map[201][201]={0};/*由于我们需要和题中要求保持一致(坐标从1开始),所以我们只需用到第1到200行(列)
我们可以用map=1来表示这个格子已经被搜过了*/
int step[201][201];//记录步数
int x1,y1,x2,y2;//分别为初始坐标与终止坐标
int num;//表示测例个数
int answer[100],cnt=0;//记录答案
void bfs();//明显的广搜
void init();//初始化
void reused();//重置map
void clear();//清空队列!!!
int canmoveto(int,int);
int moveto(int,int);
void output();
int main()
{
int i;
cin>>num;
for(i=1;i<=num;i++)
{
cin>>x1>>y1>>x2>>y2;
init();
bfs();
clear();
reused();
}
output();
}
void bfs()
{
int u,v;
int row1,col1,row2,col2;//分别对应u,v的二维形式
int j,flag=0;
while(1)
{
u=q.front();
q.pop();
if(u%200==0)//下同,一维向二维转化
{
row1=u/200;
col1=200;
}
else
{
row1=u/200+1;
col1=u%200;
}
for(j=0;j<8;j++)//j=0,1,2,3,4,5,6,7分别表示八个不同的可以走的方向(顺时针顺序)
{
if(canmoveto(u,j))//判合法(是否越界)
{
v=moveto(u,j);
if(v%200==0)
{
row2=v/200;
col2=200;
}
else
{
row2=v/200+1;
col2=v%200;
}
if(row2==x2&&col2==y2)//判目标
{
answer[cnt]=step[row1][col1]+1;
cnt++;
flag=1;
break;
}
else
{
if(map[row2][col2]!=1)//判价值(是否被搜过)
{
q.push(v);
map[row2][col2]=1;
step[row2][col2]=step[row1][col1]+1;
}
}
}
}
if(flag==1)
{
break;
}
}
}
int canmoveto(int u,int j)
{
int row,col;
if(u%200==0)
{
row=u/200;
col=200;
}
else
{
row=u/200+1;
col=u%200;
}
if(j==0&&row-2>=1&&col+1<=200)
{
return(1);
}
else if(j==1&&row-1>=1&&col+2<=200)
{
return(1);
}
else if(j==2&&row+1<=200&&col+2<=200)
{
return(1);
}
else if(j==3&&row+2<=200&&col+1<=200)
{
return(1);
}
else if(j==4&&row+2<=200&&col-1>=1)
{
return(1);
}
else if(j==5&&row+1<=200&&col-2>=1)
{
return(1);
}
else if(j==6&&row-1>=1&&col-2>=1)
{
return(1);
}
else if(j==7&&row-2>=1&&col-1>=1)
{
return(1);
}
else
{
return(0);
}
}
int moveto(int u,int j)
{
int row,col;
if(u%200==0)
{
row=u/200;
col=200;
}
else
{
row=u/200+1;
col=u%200;
}
if(j==0)
{
row=row-2;
col=col+1;
}
else if(j==1)
{
row=row-1;
col=col+2;
}
else if(j==2)
{
row=row+1;
col=col+2;
}
else if(j==3)
{
row=row+2;
col=col+1;
}
else if(j==4)
{
row=row+2;
col=col-1;
}
else if(j==5)
{
row=row+1;
col=col-2;
}
else if(j==6)
{
row=row-1;
col=col-2;
}
else if(j==7)
{
row=row-2;
col=col-1;
}
return((row-1)*200+col);//二维转化成一维
}
void init()
{
q.push((x1-1)*200+y1);
map[x1][y1]=1;
step[x1][y1]=0;
}
void output()
{
int i;
for(i=0;i<cnt;i++)
{
cout<<answer[i]<<endl;
}
}
void reused()
{
int i,j;
for(i=1;i<=200;i++)
{
for(j=1;j<=200;j++)
{
map[i][j]=0;
step[i][j]=0;
}
}
}
void clear()
{
while(!q.empty())
{
q.pop();
}
}