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