补题链接:Here

本题代码由贺佬完成

这道题基本算一道 BFS 进阶题,有少许细节要小心 (WA1发。。

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
using ll = long long;
const int maxn = 300 + 10;
const int inf = 0x3f3f3f3f; typedef pair<int, int> pii;
int n, m, q;
char g[maxn][maxn];
vector<int> f[maxn *
maxn]; //传送阵,若为0说明没有,值代表传送阵的另一端.
int step[maxn][maxn];
int go[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
pii st, ed;
struct node {
int x, y;
};
void bfs() {
queue<node> q;
node head, temp;
head.x = st.x, head.y = st.y;
step[st.x][st.y] = 0;
q.push(head);
while (!q.empty()) {
head = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
temp.x = head.x + go[i][0], temp.y = head.y + go[i][1];
if (temp.x >= 0 && temp.x < n && temp.y >= 0 && temp.y < m
&& g[temp.x][temp.y] != '#'
&& step[temp.x][temp.y] > step[head.x][head.y] + 1) {
step[temp.x][temp.y] = step[head.x][head.y] + 1;
q.push(temp);
}
}
if (f[head.x * m + head.y].size() > 0) {
for (int i = 0; i < f[head.x * m + head.y].size(); i++) {
temp.x = f[head.x * m + head.y][i] / m,
temp.y = f[head.x * m + head.y][i] % m;
if (g[temp.x][temp.y] != '#'
&& step[temp.x][temp.y] > step[head.x][head.y] + 3) {
step[temp.x][temp.y] = step[head.x][head.y] + 3;
q.push(temp);
}
}
}
}
if (step[ed.x][ed.y] == inf)step[ed.x][ed.y] = -1;
cout << step[ed.x][ed.y] << endl;
}
void solve() {
bfs();
}
int main() {
// ios::sync_with_stdio(false)
while (cin >> n >> m >> q) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> g[i][j];
if (g[i][j] == 'S') {
st.x = i, st.y = j;
}
else if (g[i][j] == 'T') {
ed.x = i, ed.y = j;
}
step[i][j] = inf;
}
}
for (int i = 0; i <= n * m; i++) {
f[i].clear();
}
pii a, b;
int temp1, temp2;
for (int i = 0; i < q; i++) {
cin >> a.x >> a.y >> b.x >> b.y;
temp1 = a.x * m + a.y, temp2 = b.x * m + b.y;
f[temp1].push_back(temp2);
}
solve();
}
return 0;
}

【每日一题】29.maze (BFS 进阶)的更多相关文章

  1. 【每日一题】【BFS&Lambda&重建二叉树】2022年2月15日-根据先序中序重建并输出二叉树的右视图

    描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 思路:重建&层次遍历记录最后一个&Lambda表达式 答案: import java.util.*; publ ...

  2. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  3. PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数

    PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数 最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可 ...

  4. [每日一题]ES6中为什么要使用Symbol?

    关注「松宝写代码」,精选好文,每日面试题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目 ...

  5. 「每日一题」面试官问你对Promise的理解?可能是需要你能手动实现各个特性

    关注「松宝写代码」,精选好文,每日一题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目类 ...

  6. 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...

  7. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  8. [每日一题]面试官问:for in和for of 的区别和原理?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  9. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  10. 【python】Leetcode每日一题-矩阵置零

    [python]Leetcode每日一题-矩阵置零 [题目描述] 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解 ...

随机推荐

  1. Excel 条件定位

    查找定位 可以将所有空单元的值填上 方法:先使用定位条件选择区域中空单元格,输入100,按组合键Ctrl+Enter 仅复制分类汇总结果 先将数据进行组合 数据 -> 组合 如果直接复制,会把所 ...

  2. notify为什么会引发超时,notify和notifyAll的区别

    notify为什么会引发超时,notify和notifyAll的区别 每个同步对象都有对应的monitor,首先了解下monitor的内部结构. 1.monitor结构 Owner:指向拥有该同步对象 ...

  3. AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--

    手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导. 在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序. 本节的程序的需求是,接收CAD用 ...

  4. 使用Slurm集群进行分布式图计算:对Github网络影响力的系统分析

    本文分享自华为云社区<基于Slurm集群的分布式图计算应用实践:Github协作网络影响力分析>,作者:yd_263841138 . 1. 引言 Slurm(Simple Linux Ut ...

  5. java当中组件和窗口的相容问题(里面包含了这些方法的作用)

    窗口也称为容器,在书中大部分称为容器,这里主要讲的是底层容器. JFrame():创建一个无标签的窗口. JFrame(String s):创建标题为s的窗口 setBounds(int a,int ...

  6. springboot下添加日志模块和设置日志文件输出

    前言 日志的使用将通过SLF4J来使用,SLF4J(Simple Logging Facade for Java)是一个为Java应用提供简单日志记录的接口.它的主要目标是在不同的日志系统之间提供一个 ...

  7. [ABC265C] Belt Conveyor

    Problem Statement We have a grid with $H$ horizontal rows and $W$ vertical columns. $(i, j)$ denotes ...

  8. scroll-view和swiper的使用

    源码: <template>            <viex class="out">            <view class="b ...

  9. 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。

    2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵. ...

  10. Java线程池ThreadPoolExecutor源码解析

    Java线程池ThreadPoolExecutor源码解析 1.ThreadPoolExecutor的构造实现 以jdk8为准,常说线程池有七大参数,通常而言,有四个参数是比较重要的 public T ...