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;
    }
  • 相关阅读:
    Bitmap\Bytes\BitmapImage相互转换
    枚举值为什么使用1,2,4,8,16,32等2的幂方(转)
    获取电脑信息
    操作内存的帮助类
    C#调用DLL(整理)
    [原]java集合类TreeMap和TreeSet
    [原]《面试题精选》08.颠倒句子中单词的顺序
    [原]数据结构与对象的区别
    [原]初步了解Hadoop平台
    [原]《程序员面试题精选》06.查找最小的k个元素
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11712778.html
Copyright © 2011-2022 走看看