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