现在forever97想知道,他最少需要花费多少单位时间,才能找到钥匙并从出口离开。
迷宫可以用N*M的格子表示,每个格子用字符'x'或字符'#'表示,'x'字符表示没有障碍物可以行动,'#'字符表示有障碍物无法行动。forever97可以花费一个单位时间,从当前格子向上下左右四个方向前进一格到没有障碍物的格子上。
迷宫的入口在(1,1)处,出口在(N,M)处,钥匙在(x0,y0)处。保证forever97能找到钥匙从出口离开迷宫。
迷宫共有p个传送阵,第i个传送阵在(ai,bi)处,可以传送到(ci,di)处,保证同一格子上只有一个传送阵,但多个传送阵可能传送到同一格子。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=55;
char mz[MAXN][MAXN];
int cx[MAXN][MAXN],cy[MAXN][MAXN];
int vis[2][MAXN][MAXN];
int g[2][4]={{-1,0,0,1},{0,1,-1,0}};
struct Node
{
int x,y,key,step;
Node(){}
Node(int _x,int _y,int _key,int _step)
{
x=_x,y=_y,key=_key,step=_step;
}
};
int main()
{
int n,m,x0,y0,p,a,b,c,d,ans,i,j;
while(cin>>n>>m)
{
cin>>x0>>y0>>p;
memset(vis,0,sizeof(vis));
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
while(p--)
{
cin>>a>>b>>c>>d;
cx[a][b]=c;
cy[a][b]=d;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>mz[i][j];
queue<Node>q;
if(x0==1&&y0==1)
q.push(Node(1,1,1,0)),vis[1][1][1]=1;
else
q.push(__(1)__),vis[0][1][1]=0;
while(!q.empty())
{
Node now=q.front();
q.pop();
if(now.key&&now.x==n&&now.y==m)
{
__(2)__
break;
}
for(i=0;i<5;i++)
{
__(3)__
if(i<4)
nxt.x+=g[0][i],nxt.y+=g[1][i];
else if(cx[now.x][now.y])
nxt.x=cx[now.x][now.y],nxt.y=cy[now.x][now.y];
else
__(4)__
nxt.step++;
if(nxt.x==x0&&nxt.y==y0)
nxt.key=1;
if(nxt.x<1||nxt.x>n||nxt.y<1||nxt.y>m||vis[nxt.key][nxt.x][nxt.y]||mz[nxt.x][nxt.y]=='#')
continue;
__(5)__
vis[nxt.key][nxt.x][nxt.y]=1;
}
}
cout<<ans<<endl;
}
}