poj~1915(bfs)

Knight Moves

题意:求起点到终点最少走几步.

上双向广搜代码:

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


你可能感兴趣的:(bfs)