输入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
我的代码:
#include <bits/stdc++.h>
using namespace std;
struct Z{
int x,y,s;
};
const int N=1e6;
Z q[N],a,b;
int main(){
int dx[8]={1,-1,1,-1,2,2,-2,-2};
int dy[8]={2,2,-2,-2,1,-1,1,-1};
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
memset(q,0,sizeof(q));
int l,f=1,e=0;
scanf("%d%d%d%d%d",&l,&a.x,&a.y,&b.x,&b.y);
if(a.x==b.x&&a.y==b.y){
printf("0\n");
goto brea;
}
e++;
q[e]=a;
while(f<=e){
Z u=q[f];
for(int i=0;i<8;i++){
Z v;
if(u.x+dx[i]<0||u.x+dx[i]>=l||u.y+dy[i]<0||u.y+dy[i]>=l)continue;
v.x=u.x+dx[i];
v.y=u.y+dy[i];
v.s=u.s+1;
if(b.x==v.x&&b.y==v.y){
printf("%d\n",v.s);
goto brea;
}
e++;
q[e]=v;
}
f++;
}
brea:;
}
return 0;
}
不知道为什么,RE了,帮帮孩子吧