POJ 1915
//POJ 1195题 BFS骑士问题
//利用广度优先搜索求得的路径是最短路径
#include <iostream>
#include <queue>
using namespace std;
#define maxl 300
//node代表棋盘上的一个点
typedef struct node
{
int x;
int y;
int d;//d代表这个点到起始点的距离
};
node s,e;//s和e分别代表起始点和终点
int l;//l代表棋盘的边长
//代表8个方向的偏移,例如(-2,1)为向左上方移动
int dirx[]={-2,-1,1,2,2,1,-1,-2};
int diry[]={1,2,2,1,-1,-2,-2,-1};
char hash[maxl][maxl];//标识该点是否在队列中
int d;
void bfs()
{
queue<node> q;
node front = s;
front.d = 0;
q.push(s);
hash[s.x][s.y] = 1;
while(!q.empty())
{
front = q.front();
q.pop();
if(front.x==e.x && front.y==e.y)
{
cout<<front.d<<endl;
break;
}
for(int i=0;i<8;i++)
{
//判断向8个方向移动时是否超出棋盘
if(front.x+dirx[i]<0 || front.x+dirx[i]>l-1 || front.y+diry[i]<0 || front.y+diry[i]>l-1)
continue;
if(!hash[front.x +dirx[i]][front.y+diry[i]])
{
node temp = front;
temp.x = front.x+dirx[i];
temp.y = front.y+diry[i];
temp.d++;//此处改变距离
q.push(temp);
hash[temp.x][temp.y]=1;
}
}
}
}
int main()
{
int n;
int x,y;
cin>>n;
for(int i=0;i<n;i++)
{
//初始化
memset(hash,0,sizeof(hash));
d=0;
cin>>l;
cin>>s.x>>s.y>>e.x>>e.y;
bfs();
}
return 0;
}
浙公网安备 33010602011771号