sicily 1215. 脱离地牢

#include<iostream> //bfs
#include<queue>
using namespace std;
struct node
{
int si,sj,ti,tj,step; //(si,sj),(ti,tj)分别是Paris,Helen的位置,step是步数
}fro,rear;
queue
<node> col;
int n,m,vis[20][20][20][20];
char ch[20][20],way[8]={'N','S','W','E'};
int dis[8][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main()
{
cin
>>n>>m;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
cin
>>ch[i][j];
if(ch[i][j]=='P')
fro.si
=i,fro.sj=j;
else if(ch[i][j]=='H')
fro.ti
=i,fro.tj=j;
}
fro.step
=0;
col.push(fro);
vis[fro.si][fro.sj][fro.ti][fro.tj]
=1;
cin
>>way+4;
for(int i=4;i<8;++i)
for(int j=0;j<4;++j)
if(way[i]==way[j])
dis[i][
0]=dis[j][0],dis[i][1]=dis[j][1];
//使得dis[i+4]与dis[i]相对应,即若Paris的转向是(dis[i][0],dis[i][1]),则Helen的转向是(dis[i+4][0],dis[i+4][1])
int tag=1,mov1,mov2,mov3,mov4;

while(tag&&!col.empty()&&col.front().step<255)
{
fro
=col.front();
col.pop();
for(int i=0;i<4;++i)
{
mov1
=fro.si+dis[i][0];
mov2
=fro.sj+dis[i][1];
mov3
=fro.ti+dis[i+4][0];
mov4
=fro.tj+dis[i+4][1];
if(ch[mov1][mov2]=='#'||ch[mov1][mov2]=='!'||ch[mov3][mov4]=='!') //因为"四周均是均是岩石或熔浆",故不必讨论越界的情况
continue;
if(ch[mov3][mov4]=='#') //"如果Helen碰到岩石上,那么她将停留在原地"
mov3=fro.ti,mov4=fro.tj;
if(vis[mov1][mov2][mov3][mov4]==1)
continue;
vis[mov1][mov2][mov3][mov4]
=1;
rear.step
=fro.step+1;
rear.si
=mov1;rear.sj=mov2;
rear.ti
=mov3;rear.tj=mov4;
//注意相遇是指Paris与Helen最终到达同一个格子,或者二人在相邻两格移动后碰在了一起
if( (rear.si==rear.ti&&rear.sj==rear.tj) || (fro.si==rear.ti&&fro.sj==rear.tj&&fro.ti==rear.si&&fro.tj==rear.sj) )
{
cout
<<rear.step<<endl;
tag
=0;
break;
}
col.push(rear);
}
}
if(tag)
cout
<<"Impossible\n";
return 0;
}

posted on 2011-07-05 02:03  sysu_mjc  阅读(247)  评论(0编辑  收藏  举报

导航