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;

}

  

你可能感兴趣的:(poj)