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;
}

posted @ 2010-04-15 13:35  北海小龙  阅读(246)  评论(0)    收藏  举报