hrbust 移动(宽度优先搜索)

Description

在平面坐标系内,有两个坐标轴x轴和y轴。(x,y)表示点的坐标。

有一点处于(x1,y1)位置上,他可以向相临8个位置移动(移动方式见下图)。

划定范围:此点只可以在[0<=x<=300,0<=y<=300]范围内移动。

要求:给出起始位置(x1,y1)和目标位置(x2,y2),要求同学求出从起始位置移动到目标位置所需的最少次数。

Input

输入包括多组测试用例。

对于每组测试用例,包含4个正整数,x1,y1,x2,y2,范围均为[0,300]。

Output
输出移动所需的最少次数。
Sample Input

0 0 1 2

0 0 2 1

Sample Output

1

1

 1 #include<stdio.h>
 2 #include<string.h>
 3 int s[301][301];
 4 int v[301][301];
 5 int step[301][301];
 6 int f[16]={-1,-2,-2,-1,1,2,2,1,-2,-1,1,2,2,1,-1,-2};
 7 struct no
 8 {
 9     int x,y;
10 }q[100001];
11 int main()
12 {
13     int front,rear,i,j,t,n,xx,yy,x0,y0,x1,y1;
14     while(scanf("%d%d%d%d",&x0,&y0,&xx,&yy)!=EOF)
15     {
16         n=301;
17         memset(v,0,sizeof(v));
18         memset(step,0,sizeof(step));
19         front=rear=0;
20         q[rear].x=x0;
21         q[rear++].y=y0;
22         v[x0][y0]=1;
23         while(front<rear)
24         {
25             for(i=0;i<8;i++)
26             {
27                 x1=q[front].x+f[i];
28                 y1=q[front].y+f[i+8];
29                 if(x1>=0&&x1<n&&y1>=0&&y1<n&&(!v[x1][y1]))
30                 {
31                     q[rear].x=x1;
32                     q[rear++].y=y1;
33                     v[x1][y1]=1;
34                     step[x1][y1]=step[q[front].x][q[front].y]+1;
35                     if(v[xx][yy])
36                         break;
37                 }
38             }
39             front++;
40         }
41             printf("%d\n",step[xx][yy]);
42     }
43     return 0;
44 }

 

posted @ 2012-10-09 21:43  尔滨之夏  阅读(394)  评论(0编辑  收藏  举报