您的位置:首页 > 其它

hrbust 移动(宽度优先搜索)

2012-10-09 21:43 369 查看
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

#include<stdio.h>
#include<string.h>
int s[301][301];
int v[301][301];
int step[301][301];
int f[16]={-1,-2,-2,-1,1,2,2,1,-2,-1,1,2,2,1,-1,-2};
struct no
{
int x,y;
}q[100001];
int main()
{
int front,rear,i,j,t,n,xx,yy,x0,y0,x1,y1;
while(scanf("%d%d%d%d",&x0,&y0,&xx,&yy)!=EOF)
{
n=301;
memset(v,0,sizeof(v));
memset(step,0,sizeof(step));
front=rear=0;
q[rear].x=x0;
q[rear++].y=y0;
v[x0][y0]=1;
while(front<rear)
{
for(i=0;i<8;i++)
{
x1=q[front].x+f[i];
y1=q[front].y+f[i+8];
if(x1>=0&&x1<n&&y1>=0&&y1<n&&(!v[x1][y1]))
{
q[rear].x=x1;
q[rear++].y=y1;
v[x1][y1]=1;
step[x1][y1]=step[q[front].x][q[front].y]+1;
if(v[xx][yy])
break;
}
}
front++;
}
printf("%d\n",step[xx][yy]);
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: