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