农夫Somurolov认为自己是最厉害的棋手,他能让骑士从一个位置最快速地移动到另一个位置,不过做为一名会搜索算法的程序萌手,必然不能认输,现在你就写编写一个程序,找到骑士从一个位置移动到另外一个位置的最小步数,从而打败Somurolov。棋盘上的骑士移动如下图所示:

第一行一个数n,表示有多组数据。接下来的每组数据包括三行:
第一行为一个数m(4≤m≤300),表示棋盘的长和宽,显然这里是一个正方形的棋盘;
第二、三行各有两个数,表示起点位置和终点位置,当然这两个位置都应该在棋盘内。
你可以假定所有数据都是有效的,即起点一定能到达终点。
对于每组数据,输出从起点到终点的最少移动步数,如果起点和终点相同,则输出0。
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
5
28
0
#include<bits/stdc++.h>
using namespace std;
const int dx[8]={-1,-2,-2,-1,1,2,2,1};
const int dy[8]={-2,-1,1,2,2,1,-1,-2};
struct Node{
int x,y;
};
queue<Node>q;
int d[310][310];
int bfs();
int n,m,X,Y,X1,Y1;
int main()
{
cin>>n;
while (n--){//多组数据
cin>>m;
while (!q.empty()) q.pop();//队列初始化
memset(d,0,sizeof(d));//标记初始化
cin>>X>>Y;//起始点读入
cin>>X1>>Y1;//目标点读入
if (X==X1&&Y==Y1){
cout<<0<<endl;
continue;
}//判断是否已在目标点
bfs();
}
return 0;
}
int bfs(){
q.push({X,Y});//起始点压入
while (!q.empty()){
Node tmp=q.front(); q.pop();
bool pd=0;
for (int i=0;i<8;i++){
int x1=tmp.x+dx[i];
int y1=tmp.y+dy[i];//位置转换
if (d[x1][y1]&&x1>=0&&y1>=0&&x1<m&&y1<m) continue;//判断是否走过或越界
d[x1][y1]=d[tmp.x][tmp.y]+1;
if (x1==X1&&y1==Y1){
cout<<d[x1][y1]<<endl;
pd=1;
break;
}//如果到达就输出,退出搜索
q.push({x1,y1});//压入新点
}
if (pd) break;
}
}