题意:求起点到终点最少走几步.
上双向广搜代码:
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int n,sx,sy,ex,ey;
int dirx[]={-2,-2,-1,-1,1,1,2,2}; //题意 ,8个方向
int diry[]={1,-1,2,-2,2,-2,1,-1};
typedef struct point{
int x,y;
}point;
int step[305][305]; //存步数
int vis[305][305]; //标记 是否走过 及从起点走的 还是终点走的
void bfs(){
memset(step,0,sizeof(step));
memset(vis,0,sizeof(vis));
point start,end;
start.x=sx,start.y=sy;
end.x=ex,end.y=ey;
queue <point > q;
q.push(start); //起点入队
q.push(end); //终点入队
vis[sx][sy]=1; //从起点走的标记为1
vis[ex][ey]=2; //终点走的标记为2
while(!q.empty()){
point temp=q.front();
q.pop();
for(int i=0;i<8;++i){
point next=temp;
next.x+=dirx[i];
next.y+=diry[i];
if(next.x<0 || next.y<0 || next.x>=n || next.y>=n) continue; //越界
if(vis[next.x][next.y]==0){ //未走过
q.push(next);
vis[next.x][next.y]=vis[temp.x][temp.y];
step[next.x][next.y]=step[temp.x][temp.y]+1;
}
else if(vis[next.x][next.y]!=vis[temp.x][temp.y]){ //标记不一样,即从起点走的与从终点走的相遇
printf("%d\n",step[next.x][next.y]+step[temp.x][temp.y]+1);
return ;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%d %d",&sx,&sy);
scanf("%d %d",&ex,&ey);
if(sx==ex && sy==ey) printf("0\n");
else bfs();
}
return 0;
}