小明来到一个由n x m个格子组成的迷宫,有些格子是陷阱,用’#‘表示,小明进入陷阱就会死亡,’.'表示没有陷阱。小明所在的位置用’S’表示,目的地用’T’表示。
小明只能向上下左右相邻的格子移动,每移动一次花费1秒。
有q个单向传送阵,每个传送阵各有一个入口和一个出口,入口和出口都在迷宫的格子里,当走到或被传送到一个有传送阵入口的格子时,小明可以选择是否开启传送阵。如果开启传送阵,小明就会被传送到出口对应的格子里,这个过程会花费3秒;如果不开启传送阵,将不会发生任何事情,小明可以继续向上下左右四个方向移动。
一个格子可能既有多个入口,又有多个出口,小明可以选择任意一个入口开启传送阵。使用传送阵是非常危险的,因为有的传送阵的出口在陷阱里,如果小明使用这样的传送阵,那他就会死亡。也有一些传送阵的入口在陷阱里,这样的传送阵是没有用的,因为小明不能活着进入。请告诉小明活着到达目的地的最短时间。
const ll mod=1e9+7;
const int N=2e5+5;
思路:确定这个题目的算法采用算法为bfs()因为多加了一个传送们 所以要领开辟一个数组来专门存储这个传送们起点 终点 vector<pair<int,int>> G[maxn][maxn] 接下来的将起点 传送门的起点放入这个优先队列propriety_queue() 要次用小根堆的方式进行存储,接下来 q.push(sx,sy,0) 起点 G[sx][sy].size() 这vector存储的信息 int lx=G[sx][sy][i].first int ly=G[sx][sy][i].second 2.判断—>(q.psuh(x,y,3)) 接下来判断这个队列是否为空不空的话就获取对头 人后对他进行四个方向的判断 并且判断这四个方向是否满足if条件 然后获取int lx=G[xx][yy][i].first() int ly=G[xx][yy][i].second
然后判断这个lx,ly这个if条件满足条件进入传送门
else 不进入传送门q.push({xx,yy,step+1})
a.push({lx,ly,step+4}) 终止if(now.xex&&now.yey) return now.step;
为空 返回-1
char maze[305][305];
int dist[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
int x,y,step;
node(int _x=0,int _y=0,int _step=0):x(_x),y(_y),step(_step){}
bool operator<(const node &s) const{
return step>s.step;
}
};
int sx,sy,ex,ey,n,m,qu;
bool vis[305][305];
vector<pair<int,int> >G[305][305];
int bfs()
{
priority_queue q;
q.push(node(sx,sy,0));
for(int i=0;i<G[sx][sy].size();i++)
{
int lx=G[sx][sy].first();
int ly=G[sx][sy].second();
if(!vis[lx][ly]&&maze[lx][ly]!=’#’&&lx>=1&&lx<=n&&ly>=1&&ly<=m)
{
q.push(node(lx,ly,3));
}
}
while(!q.empty())
{
node now=q.top();
if(vis[now,x][now.y]) continue;
vis[now.x][now.y]=1;
if(now.xex&&now.yey) return now.step;
for(int i=0;i<4;i++)
{
int xx=now.x+dist[i][0];
int yy=now.y=dist[i][1];
if(!vis[xx][yy]&&maze[xx][yy]!=’#’&&xx>=1&&xx<=n&&yy>=1&&yy<=m)
{
for(int j=0;G[xx][yy].size();j++)
{
int kx=G[xx][yy][j].first;
int ky=G[xx][yy][j].second;
if(!vis[kx][ky]&&maze[kx][ky]!=’#’&&kx>=1&&kx<=n&&ky>=1&&ky<=m)
{
q.push(node(kx,ky,step+4));
}
}
q.push(xx,yy,step+1);
}
}
}
return -1;
}
int main()
{
while(cin>>n>>m>>qu)
{
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)
{
G[i][j].clear(),vis[i][j]=0;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mazz[i][j];
if(mazz[i][j]‘S’)
{
sx=i;
sy=j;
}
if(mazz[i][j]‘T’)
{
ex=i;
ey=j;
}
}
}
while(qu--)
{
cin>>x1>>y1>>x2>>y2;
x1++,y1++,x2++,y2++;
G[x1][y1].push_back({x2,y2});
}
cout<<bfs()<<endl;
return 0;
}