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