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;
}
浙公网安备 33010602011771号