【题目描述】
输入n代表有个n×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

【输入】
首先输入一个n,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4≤L≤300);
第二行和第三行分别表示马的起始位置和目标位置(0..L−1)。
【输出】
马移动的最小步数,起始位置和目标位置相同时输出0。
【输入样例】
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
【输出样例】
5
28
0
cpp
#include <iostream>
#include <queue>
using namespace std;
int sx,sy,fx,fy;//起点终点横纵坐标
int l;//棋盘大小
int vis[301][301];//vis数组,代表棋盘中这个点是否走过,如走过需要走几步
int dx[8]={1,2,1,2,-1,-2,-1,-2};
int dy[8]={2,1,-2,-1,2,1,-2,-1};
struct node{
int x;
int y;
};
queue<node> q;
void bfs(int x,int y){//代表马现在坐标为x y
node tmp;
tmp.x=x;
tmp.y=y;
q.push(tmp);//起点入队
while(!q.empty()){//当队非空
tmp=q.front();//访问队首元素
if(tmp.x==fx && tmp.y==fy){
cout<<vis[tmp.x][tmp.y]-1<<endl;
return;
}
q.pop();//队首出队
for(int i=0;i<8;i++){//八种移动方式
node np;
np.x=tmp.x+dx[i];
np.y=tmp.y+dy[i];
//先判断边界 再判断没有走过该点
if(np.x>=0 && np.x<l && np.y>=0 && np.y<l && vis[np.x][np.y]==0){
q.push(np);
vis[np.x][np.y]=vis[tmp.x][tmp.y]+1;//标记访问过,并记录下步数
}
}
}
}
int main(){
int n;
cin>>n;
while(n--){
cin>>l;
cin>>sx>>sy>>fx>>fy;
while(!q.empty()) q.pop();//初始化队列,防止队列非空
memset(vis,0,sizeof(vis));//初始化vis数组
vis[sx][sy]=1;
bfs(sx,sy);
}
}