poj1915(双向bfs)

题目链接:https://vjudge.net/problem/POJ-1915

题意:求棋盘上起点到终点最少的步数。

思路:双向广搜模板题,但玄学的是我的代码G++会wa,C++过了,没找到原因QAQ。。

AC代码:

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn=305;
int go[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
int T,n,sx,sy,ex,ey,vis1[maxn][maxn],vis2[maxn][maxn];

struct node{
    int x,y,s;
    node():x(0),y(0),s(0){}
    node(int x,int y,int s):x(x),y(y),s(s){}
};

int bfs(){
    vis1[sx][sy]=vis2[ex][ey]=0;
    queue<node> que1,que2;
    que1.push(node(sx,sy,0));
    que2.push(node(ex,ey,0));
    while(!que1.empty()||!que2.empty()){
        if(!que1.empty()){
            node now=que1.front();que1.pop();
            int nx=now.x,ny=now.y,ns=now.s;
            if(vis2[nx][ny]>=0){
                return ns+vis2[nx][ny];
            }
            for(int i=0;i<8;++i){
                int xx=nx+go[i][0],yy=ny+go[i][1];
                if(xx<1||xx>n||yy<1||yy>n||vis1[xx][yy]>=0) continue;
                vis1[xx][yy]=ns+1;
                que1.push(node(xx,yy,ns+1));
            }
        }
        if(!que2.empty()){
            node now=que2.front();que2.pop();
            int nx=now.x,ny=now.y,ns=now.s;
            if(vis1[nx][ny]>=0){
                return ns+vis1[nx][ny];
            }
            for(int i=0;i<8;++i){
                int xx=nx+go[i][0],yy=ny+go[i][1];
                if(xx<1||xx>n||yy<1||yy>n||vis2[xx][yy]>=0) continue;
                vis2[xx][yy]=ns+1;
                que2.push(node(xx,yy,ns+1));
            }
        }
    }
}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                vis1[i][j]=vis2[i][j]=-1;
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        ++sx,++sy,++ex,++ey;
        if(sx==ex&&sy==ey)
            printf("0
");
        else
            printf("%d
",bfs());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/FrankChen831X/p/11712778.html