zoukankan      html  css  js  c++  java
  • poj 3322 Bloxorz I 夜

    http://poj.org/problem?id=3322

    bfs  由于状态多了 所以要多开一维数组记录状态 没有什么难度 只不过是比较繁琐

    ans忘了初始化 贡献了一次wa

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<set>
    #include<queue>
    #include<stack>
    #include<cmath>
    #define LL long long
    
    using namespace std;
    
    const int N=510;
    const int M=2000000;
    bool visited[N][N][5];
    struct node
    {
        int x,y,k,step;
    }que[M];
    int I,J;
    int ans=-1;
    char gar[N][N];
    int ndx,ndy;
    int n,m;
    void inqueue0(int x,int y,int step)
    {
        if(y+2<=m&&visited[x][y+2][4]==false){
            visited[x][y+2][4]=true;
            visited[x][y+1][2]=true;
            que[J].x=x;que[J].y=y+2;que[J].k=4;que[J].step=step+1;++J;
            que[J].x=x;que[J].y=y+1;que[J].k=2;que[J].step=step+1;++J;
        }
        if(x+2<=n&&visited[x+2][y][3]==false){
            visited[x+2][y][3]=true;
            visited[x+1][y][1]=true;
            que[J].x=x+2;que[J].y=y;que[J].k=3;que[J].step=step+1;++J;
            que[J].x=x+1;que[J].y=y;que[J].k=1;que[J].step=step+1;++J;
        }
        if(y-2>=0&&visited[x][y-2][2]==false){
            visited[x][y-2][2]=true;
            visited[x][y-1][4]=true;
            que[J].x=x;que[J].y=y-2;que[J].k=2;que[J].step=step+1;++J;
            que[J].x=x;que[J].y=y-1;que[J].k=4;que[J].step=step+1;++J;
        }
        if(x-2>=0&&visited[x-2][y][1]==false){
            visited[x-2][y][1]=true;
            visited[x-1][y][3]=true;
            que[J].x=x-2;que[J].y=y;que[J].k=1;que[J].step=step+1;++J;
            que[J].x=x-1;que[J].y=y;que[J].k=3;que[J].step=step+1;++J;
        }
    }
    void inqueue1(int x,int y,int step)
    {
        if(x-1>=0&&visited[x-1][y][0]==false){
            visited[x-1][y][0]=true;
            if(x-1==ndx&&y==ndy)
            {ans=step+1;return ;}
            que[J].x=x-1;que[J].y=y;que[J].k=0;que[J].step=step+1;++J;
        }
        if(y+1<=m&&visited[x][y+1][1]==false){
            visited[x][y+1][1]=true;
            visited[x+1][y+1][3]=true;
            que[J].x=x;que[J].y=y+1;que[J].k=1;que[J].step=step+1;++J;
            que[J].x=x+1;que[J].y=y+1;que[J].k=3;que[J].step=step+1;++J;
        }
        if(y-1>=0&&visited[x][y-1][1]==false){
            visited[x][y-1][1]=true;
            visited[x+1][y-1][3]=true;
            que[J].x=x;que[J].y=y-1;que[J].k=1;que[J].step=step+1;++J;
            que[J].x=x+1;que[J].y=y-1;que[J].k=3;que[J].step=step+1;++J;
        }
    }
    void inqueue2(int x,int y,int step)
    {
        if(y-1>=0&&visited[x][y-1][0]==false){
            visited[x][y-1][0]=true;
            if(x==ndx&&y-1==ndy)
            {ans=step+1;return ;}
            que[J].x=x;que[J].y=y-1;que[J].k=0;que[J].step=step+1;++J;
        }
        if(x+1<=n&&visited[x+1][y][2]==false){
            visited[x+1][y][2]=true;
            visited[x+1][y+1][4]=true;
            que[J].x=x+1;que[J].y=y;que[J].k=2;que[J].step=step+1;++J;
            que[J].x=x+1;que[J].y=y+1;que[J].k=4;que[J].step=step+1;++J;
        }
        if(x-1>=0&&visited[x-1][y][2]==false){
            visited[x-1][y][2]=true;
            visited[x-1][y+1][4]=true;
            que[J].x=x-1;que[J].y=y;que[J].k=2;que[J].step=step+1;++J;
            que[J].x=x-1;que[J].y=y+1;que[J].k=4;que[J].step=step+1;++J;
        }
    }
    void inqueue3(int x,int y,int step)
    {
        if(x+1<=n&&visited[x+1][y][0]==false){
            visited[x+1][y][0]=true;
            if(x+1==ndx&&y==ndy)
            {ans=step+1;return ;}
            que[J].x=x+1;que[J].y=y;que[J].k=0;que[J].step=step+1;++J;
        }
        if(y+1<=m&&visited[x][y+1][3]==false){
            visited[x][y+1][3]=true;
            visited[x-1][y+1][1]=true;
            que[J].x=x;que[J].y=y+1;que[J].k=3;que[J].step=step+1;++J;
            que[J].x=x-1;que[J].y=y+1;que[J].k=1;que[J].step=step+1;++J;
        }
        if(y-1>=0&&visited[x][y-1][3]==false){
            visited[x][y-1][3]=true;
            visited[x-1][y-1][1]=true;
            que[J].x=x;que[J].y=y-1;que[J].k=3;que[J].step=step+1;++J;
            que[J].x=x-1;que[J].y=y-1;que[J].k=1;que[J].step=step+1;++J;
        }
    }
    void inqueue4(int x,int y,int step)
    {
        if(y+1<=m&&visited[x][y+1][0]==false){
            visited[x][y+1][0]=true;
            if(x==ndx&&y+1==ndy)
            {ans=step+1;return ;}
            que[J].x=x;que[J].y=y+1;que[J].k=0;que[J].step=step+1;++J;
        }
        if(x+1<=n&&visited[x+1][y][4]==false){
            visited[x+1][y][4]=true;
            visited[x+1][y-1][2]=true;
            que[J].x=x+1;que[J].y=y;que[J].k=4;que[J].step=step+1;++J;
            que[J].x=x+1;que[J].y=y-1;que[J].k=2;que[J].step=step+1;++J;
        }
        if(x-1>=0&&visited[x-1][y][4]==false){
            visited[x-1][y][4]=true;
            visited[x-1][y-1][2]=true;
            que[J].x=x-1;que[J].y=y;que[J].k=4;que[J].step=step+1;++J;
            que[J].x=x-1;que[J].y=y-1;que[J].k=2;que[J].step=step+1;++J;
        }
    }
    void bfs()
    {
        ans=-1;
        while(I<J)
        {
            int x=que[I].x;
            int y=que[I].y;
            int k=que[I].k;
            int step=que[I].step;
            ++I;
            switch(k)
            {
                case 0 :inqueue0(x,y,step);break;
                case 1 :inqueue1(x,y,step);break;
                case 2 :inqueue2(x,y,step);break;
                case 3 :inqueue3(x,y,step);break;
                case 4 :inqueue4(x,y,step);break;
                default: break;
            }
            if(ans!=-1)
            return ;
        }
    }
    int main()
    {
    //    freopen("data.txt","r",stdin);
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            if(n==0&&m==0)
            break;
            memset(visited,false,sizeof(visited));
            for(int i=1;i<=n;++i)
            {
               getchar();
               for(int j=1;j<=m;++j)
               {
                   scanf("%c",&gar[i][j]);
                   if(gar[i][j]=='#')
                   {
                       for(int l=0;l<5;++l)
                       visited[i][j][l]=true;
                       visited[i+1][j][3]=true;
                       visited[i][j+1][4]=true;
                       if(i-1>=0)
                       visited[i-1][j][1]=true;
                       if(j-1>=0)
                       visited[i][j-1][2]=true;
                   }else if(gar[i][j]=='E')
                   {
                       visited[i][j][0]=true;
                   }
               }
            }
            bool st=false;
            I=J=0;
            for(int i=1;i<=n;++i)
            {
                for(int j=1;j<=m;++j)
                {
                   if(gar[i][j]=='O')
                   {
                       ndx=i;ndy=j;continue;
                   }
                   if(st==false&&gar[i][j]=='X')
                   {
                       st=true;
                       if(j+1<=m&&gar[i][j+1]=='X')
                       {
                           visited[i][j][2]=true;
                           visited[i][j+1][4]=true;
                           que[J].x=i;que[J].y=j;que[J].k=2;que[J].step=0;++J;
                           que[J].x=i;que[J].y=j+1;que[J].k=4;que[J].step=0;++J;
                       }else if(i+1<=n&&gar[i+1][j]=='X')
                       {
                           visited[i][j][1]=true;
                           visited[i+1][j][3]=true;
                           que[J].x=i;que[J].y=j;que[J].k=1;que[J].step=0;++J;
                           que[J].x=i+1;que[J].y=j;que[J].k=3;que[J].step=0;++J;
                       }else
                       {
                           visited[i][j][0]=true;
                           que[J].x=i;que[J].y=j;que[J].k=0;que[J].step=0;++J;
                       }
                   }
                }
            }
            bfs();/*
            for(int i=0;i<J;++i)
            {
                cout<<que[i].x<<" "<<que[i].y<<" "<<que[i].k<<" "<<que[i].step<<endl;
            }*/
            if(ans==-1)
            printf("Impossible\n");
            else
            printf("%d\n",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Redis 优缺点
    如何保证接口的幂等性。。。。。
    自动化部署 jenkins 插件简介
    JWT与Session比较和作用
    代码注释鉴赏,喜欢就拿去用!
    python中计时模块timeit的使用方法
    【Java】JavaIO(二)、节点流
    【Java】JavaIO(一)、基础知识
    【Git】四、Git工作
    【Git】三、工作区、暂存区、版本库
  • 原文地址:https://www.cnblogs.com/liulangye/p/2649629.html
Copyright © 2011-2022 走看看