BFS裸题,用数组把8个方向存起来,然后直接BFS吧.(第一次写BFS,居然这么顺…)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define MAXN 305
using namespace std;
struct node{
int x,y,step;
};
int n;
int dis[8][2]={{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};
queue<node> q;
int vis[MAXN][MAXN],aim[2];
int bfs(int x,int y)
{
int i;
while(!q.empty())
{
q.pop();
}
node st;
st.x=x;
st.y=y;
st.step=0;
memset(vis,0,sizeof(vis));
q.push(st);
vis[x][y]=1;
while(!q.empty())
{
node qs=q.front();
q.pop();
if(qs.x==aim[0]&&qs.y==aim[1])
{
return qs.step;
}
node next;
for(i=0;i<8;i++)
{
next.x=qs.x+dis[i][0];
next.y=qs.y+dis[i][1];
if(next.x==aim[0]&&next.y==aim[1])
{
return qs.step+1;
}
if(next.x>=0&&next.x<n&&next.y>=0&&next.y<n&&vis[next.x][next.y]==0)
{
next.step=qs.step+1;
q.push(next);
vis[next.x][next.y]=1;
}
}
}
return -1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
int u,v;
cin>>u>>v;
cin>>aim[0]>>aim[1];
int ans=bfs(u,v);
cout<<ans<<endl;
}
return 0;
}