
小明来到一个由n x m个格子组成的迷宫,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱。小明所在的位置用'S'表示,目的地用'T'表示。
小明只能向上下左右相邻的格子移动,每移动一次花费1秒。
有q个单向传送阵,每个传送阵各有一个入口和一个出口,入口和出口都在迷宫的格子里,当走到或被传送到一个有传送阵入口的格子时,小明可以选择是否开启传送阵。如果开启传送阵,小明就会被传送到出口对应的格子里,这个过程会花费3秒;如果不开启传送阵,将不会发生任何事情,小明可以继续向上下左右四个方向移动。
一个格子可能既有多个入口,又有多个出口,小明可以选择任意一个入口开启传送阵。使用传送阵是非常危险的,因为有的传送阵的出口在陷阱里,如果小明使用这样的传送阵,那他就会死亡。也有一些传送阵的入口在陷阱里,这样的传送阵是没有用的,因为小明不能活着进入。请告诉小明活着到达目的地的最短时间。
题目
- 原题地址:maze
- 题目编号:NC15665
- 题目类型:BFS、双向广搜、优先队列
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 32768K,其他语言65536K
1.题目大意
- 走迷宫,有陷阱有传送门,问从起点活着到终点的最短时间
2.题目分析
3.题目代码
#include <bits/stdc++.h>
#define N 302
using namespace std;
int n, m, t;
char mp[N][N];
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
typedef struct nod{int x,y;}nod;
typedef struct node{
int x,y,sp;
bool operator<(const node &p)const{return sp>p.sp;}
}node;
nod st, ed;
priority_queue<node> q;
vector<nod> v[N][N];
bool vis[N][N];
int bfs() {
while(q.size()) {
auto z = q.top();q.pop();
if(vis[z.x][z.y]||z.x<0||z.y<0||z.x>=n||z.y>=m||mp[z.x][z.y]=='#')continue;
if(z.x==ed.x&&z.y==ed.y) return z.sp;
vis[z.x][z.y] = 1;
for(int i=0;i<4;i++) q.push({z.x+dir[i][0],z.y+dir[i][1],z.sp+1});
for(auto k:v[z.x][z.y]) q.push({k.x,k.y,z.sp+3});
}return -1;
}
int main() {
while(cin >> n >> m >> t){
while(q.size()) q.pop();
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
cin >> mp[i][j];
if(mp[i][j]=='S') st = {i,j}, q.push({i,j,0});
else if(mp[i][j]=='T') ed = {i, j};
vis[i][j] = 0, v[i][j].clear();
} while(t--) {
int a, b, c, d;
cin >> a >> b >> c >> d;
v[a][b].push_back({c,d});
} for(auto k: v[st.x][st.y]) q.push({k.x,k.y,3});
cout << bfs() << endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】