宽度优先搜索
// Problem#: 1781
// Submission#: 1213022
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
/*典型的宽度优先搜索题,可以先把所有点的距离值初始化为 -1 ,若马跳到某点,那么距离值将会
改变,若某点无法到达,那么距离值则无法更新,直接输出该点距离值即可(即 -1 )。*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int> q;
int vis[510][510];
int dis[510][510];
int dx[] = {-2, -2, -1, 1, 2, 2, 1, -1};
int dy[] = {-1, 1, 2, 2, 1, -1, -2, -2};
int main()
{
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(dis,-1,sizeof(dis));
while(!q.empty())
q.pop();
int n,x1,x2,y1,y2;
cin>>n;
cin>>x1>>y1>>x2>>y2;
vis[x1][y1]=1;
dis[x1][y1]=0;
int sum1=x1*n+y1,sum2=x2*n+y2;
if(sum1==sum2)
cout<<0<<endl;
else
{
q.push(sum1);
while(!q.empty())
{
int l=q.front(),x,y;
if(l==sum2)
break;
q.pop();
x=l/n;
y=l%n;
for(int i=0;i<8;i++)
{
int num1=x+dx[i],num2=y+dy[i];
if(num1>=0&&num1<n&&num2>=0&&num2<n)
{
if(!vis[num1][num2])
{
vis[num1][num2]=1;
dis[num1][num2]=dis[x][y]+1;
q.push(num1*n+num2);
}
}
}
}
cout<<dis[x2][y2]<<endl;
}
}
return 0;
}