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;
}

  

posted on 2012-08-21 19:51  夜->  阅读(217)  评论(0编辑  收藏  举报