zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java中JVM的原理重温【转】
    JavaBean 规范
    Java编程规范[转]
    spring mvc 多数据源切换,不支持事务控制[一]
    03-连连看-连通分析
    02-连连看-用例分析
    01参考资料
    03-稀疏矩阵
    02-对不重复的一组数据查找
    01-用链式结构打印学生成绩单
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11712778.html
Copyright © 2011-2022 走看看