POJ 1915
题意
编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。
一匹马走日字,给定起点和终点,问所需要的最小步骤。
思路
一般问到最值很明显就是bfs了,图太大了也不适合dfs。vec是向量,保存了一个点能跳到的坐标。保存从起点开始能第一次跳到的坐标的所有情况,并且刷新这些点的访问情况,访问过的、出界的不访问,按照队列结构依次往下重复直到到达目标点为止。
#include<bits/stdc++.h>
int size ;
struct status{
int x;
int y;
int step;
}q[100006];
int vec[8][2]={{-2,-1},{-1,-2},{-2,1},{-1,2},{2,-1},{1,-2},{2,1},{1,2}};
int is[333][333];
void bfs(int sx,int sy,int ex,int ey){
int head =0,tail=0;
memset(is,0,sizeof(is));
q[tail].x=sx;
q[tail].y=sy;
is[sx][sy]=1;
tail++;
while (head<tail){
if (q[head].x==ex&&q[head].y==ey){
printf("%d\n",q[head].step);
break ;
}
for(int i=0;i<8;i++){
int nx=q[head].x+vec[i][0];
int ny=q[head].y+vec[i][1];
int step=q[head].step;
if (nx>=0&&nx<size&&ny>=0&&ny<size&&is[nx][ny]==0){
q[tail].x=nx;
q[tail].y=ny;
q[tail].step=step+1;
is[nx][ny]=1;
tail++;
}
}
head ++;
}
}
int main(){
int k;
scanf("%d",&k);
int sx,sy,ex,ey;
while (k--){
scanf("%d",&size);
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
bfs(sx,sy,ex,ey);
}
return 0;
}