描述
输入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
限制
时间限制: 1000 ms
内存限制: 65536 KB
#define maxn 440
struct node{
int x,y,step;
};
int n;
int mp[maxn][maxn];
int dx[8]={1,1,-1,-1,2,2,-2,-2};
int dy[8]={2,-2,2,-2,1,-1,1,-1};
void bfs(int ax,int ay,int bx,int by){
queue<node> q;
node nod;
nod.x=ax,nod.y=ay,nod.step=0;
//尽量在内部初始化变量,不然可能出错
q.push(nod);
while(!q.empty()){
node top=q.front();
q.pop();
int newx=top.x;
int newy=top.y;
int steps=top.step;
if(newx==bx&&newy==by) {
printf("%d\n",steps);
break;
}
for(int i=0;i<8;i++){
newx=top.x+dx[i];
newy=top.y+dy[i];
if(newx>=0&&newx<n&&newy>=0&&newy<n&&mp[newx][newy]==0){
mp[newx][newy]=1;
nod.x=newx;
nod.y=newy;
nod.step=steps+1;
q.push(nod);
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
memset(mp,0,sizeof(mp));
int ax,ay,bx,by;
cin>>ax>>ay>>bx>>by;
mp[ax][ay]=1;
bfs(ax,ay,bx,by);
}
return 0;
}