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

转载于:https://www.cnblogs.com/mjc467621163/archive/2011/07/05/2097885.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值