NC15665 maze

题目

  • 原题地址:maze
  • 题目编号:NC15665
  • 题目类型:BFS、双向广搜、优先队列
  • 时间限制:C/C++ 1秒,其他语言2秒
  • 空间限制:C/C++ 32768K,其他语言65536K

1.题目大意

  • 走迷宫,有陷阱有传送门,问从起点活着到终点的最短时间

2.题目分析

  • BFS+优先队列
  • 但还是不懂诶

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;
    }
    
}
posted @   仪战群儒  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示