广度搜索BFS

马踏棋盘

Time Limit:1000ms   Memory Limit:65535KB

Description

在中国象棋中,马是按照“日”字的形状进行跳跃的。对于一个给定的位置,马每次跳跃之后可以到达的位置如下图所示

其中圆圈所在位置为马跳跃前所在位置,三角所在位置为跳跃一次后可以达到的位置
现在给出一个大小为m行n列的棋盘,以及马所在的位置(a, b)和要到达的位置(c, d),求马从初始位置到终点位置需要跳跃的最少次数。如果不可到达,则次数为0

Input

输入数据中第一行为一个整数k(0到50),表示后面测试用例的数目,每一组测试用例由2行组成,第一行为m, n两个正整数,第二行为a, b, c, d四个正整数
1 <= m, n <= 500
1 <= a, c <= m
1 <= b, d <= n

Output

对每个测试用例输出所需要的最少步数,如果不可达就输出0

Sample Input

2
5 5
1 1 3 2
10 10
2 2 5 8

Sample Output

1
3

Hint

#include <iostream>
#include <string.h>
using namespace std;

int step[501][501];
int visited[501][501];
int startx,starty,endx,endy,m,n;
struct Node
{
 int x;
 int y;
} que[250001];

void sousuo()
{
 int direct[8][2]={{1,2},{2,1},{-1,-2},{-2,-1},{-1,2},{2,-1},{1,-2},{-2,1}};
 int front=-1,rear=-1,curx,cury,tempx,tempy,i;
    que[++rear].x=startx;
    que[rear].y=starty;
    step[startx][starty]=0;
    visited[startx][starty]=1;
   while(front!=rear)
   {
    curx=que[++front].x;
       cury=que[front].y;
       if((curx==endx)&&(cury==endy))
          break;
       for(i=0;i<8;i++)
    {
     tempx=curx+direct[i][0];
     tempy=cury+direct[i][1];
     if(tempx>0&&tempx<=m&&tempy>0&&tempy<=n&&visited[tempx][tempy]==0)
     {
      step[tempx][tempy]=step[curx][cury]+1;
      visited[tempx][tempy]=1;
      que[++rear].x=tempx;
      que[rear].y=tempy;
     }
    }
   }
}

 

int main()
{
 int k;
 cin>>k;
 while(k--)
 {
  memset(step,0,sizeof(step));
  memset(visited,0,sizeof(visited));
  cin>>m>>n;
  cin>>startx>>starty>>endx>>endy;
  sousuo();
  cout<<step[endx][endy]<<endl;
 }
 return 0;
}

posted on 2009-08-05 16:48  somebody  阅读(426)  评论(0编辑  收藏  举报

导航