POJ_1915

    这个题目跟POJ_2243是非常相似的,只不过棋盘的大小是变化的而已。在读起点与终点之后,只需要从起点开始,对周围8个可达的位置进行广搜并依次记录到达该位置时的步数,当搜到终点的时候退出循环即可。

#include<stdio.h>
#include
<string.h>
int vis[310][310],dis[310][310],qx[90010],qy[90010];
int dx[]={1,2,2,1,-1,-2,-2,-1},dy[]={2,1,-1,-2,-2,-1,1,2};
int main()
{
int i,j,k,L,n,front,rear,sx,sy,tx,ty,x,y,newx,newy;
scanf(
"%d",&n);
while(n--)
{
scanf(
"%d",&L);
scanf(
"%d%d",&sx,&sy);
scanf(
"%d%d",&tx,&ty);
for(i=0;i<L;i++)
for(j=0;j<L;j++)
vis[i][j]
=0;
front
=rear=0;
qx[rear]
=sx;
qy[rear]
=sy;
rear
++;
vis[sx][sy]
=1;
dis[sx][sy]
=0;
while(front<rear)
{
x
=qx[front];
y
=qy[front];
front
++;
if(x==tx&&y==ty)
break;
for(i=0;i<8;i++)
{
newx
=x+dx[i];
newy
=y+dy[i];
if(!vis[newx][newy]&&newx>=0&&newx<L&&newy>=0&&newy<L)
{
vis[newx][newy]
=1;
dis[newx][newy]
=dis[x][y]+1;
qx[rear]
=newx;
qy[rear]
=newy;
rear
++;
}
}
}
printf(
"%d\n",dis[tx][ty]);
}
return 0;
}

  

posted on 2011-08-22 20:53  Staginner  阅读(280)  评论(0编辑  收藏  举报