【C++算法】87.BFS解决最短路径问题_为高尔夫比赛砍树

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

675. 为高尔夫比赛砍树


题目描述:

0339fa60c45511642b1d5d83f27bd81f


解法

注意:砍树要从低到高砍。

砍掉1,从1到5到2

砍掉2,从2到5到3

砍掉3,从3到5到2到6到4

砍掉4,从4到6到5

砍掉5,从5到6

砍掉6

4e11a26528f702773cd0fa1559e658b7

变成若干个迷宫问题了。

把所有的最小值求出来然后加起来。

3fc2f78c65c913da061063fc9ac8c177

但是有个问题,你怎么知道砍树的顺序呢?

所以我们要先找到砍树的顺序,弄个二维数组先存一下下标和内容,然后按照内容由小到大排序。


C++ 算法代码:

class Solution {int m, n;  // 森林的行数和列数public:int cutOffTree(vector<vector<int>>& f) {m = f.size(), n = f[0].size();// 1. 准备工作:找出所有需要砍的树,并按树的高度排序vector<pair<int, int>> trees;for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)if (f[i][j] > 1)  // 树的高度大于1才需要砍trees.push_back({i, j});// 按照树的高度从小到大排序sort(trees.begin(), trees.end(),[&](const pair<int, int>& p1, const pair<int, int>& p2) {return f[p1.first][p1.second] < f[p2.first][p2.second];});// 2. 按照顺序砍树int bx = 0, by = 0;  // 起始位置(0,0)int ret = 0;  // 总步数for (auto& [a, b] : trees) {// 计算从当前位置到下一棵树的最短步数int step = bfs(f, bx, by, a, b);if (step == -1)  // 如果无法到达,返回-1return -1;ret += step;  // 累加步数bx = a, by = b;  // 更新当前位置}return ret;}bool vis[51][51];  // 访问标记数组int dx[4] = {0, 0, 1, -1};  // 四个方向的x偏移量int dy[4] = {1, -1, 0, 0};  // 四个方向的y偏移量// BFS计算从起点(bx,by)到终点(ex,ey)的最短步数int bfs(vector<vector<int>>& f, int bx, int by, int ex, int ey) {if (bx == ex && by == ey)  // 如果起点就是终点,返回0步return 0;queue<pair<int, int>> q;memset(vis, 0, sizeof vis);  // 清空访问标记q.push({bx, by});vis[bx][by] = true;int step = 0;while (q.size()) {step++;int sz = q.size();// 处理当前层的所有节点while (sz--) {auto [a, b] = q.front();q.pop();// 尝试四个方向for (int i = 0; i < 4; i++) {int x = a + dx[i], y = b + dy[i];// 检查新位置是否合法if (x >= 0 && x < m && y >= 0 && y < n && f[x][y] != 0 && !vis[x][y]) {  // 0表示不能走的障碍物// 找到终点,返回当前步数if (x == ex && y == ey)return step;q.push({x, y});vis[x][y] = true;}}}}return -1;  // 无法到达终点}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91377.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript内存管理完全指南:从入门到精通

文章目录JavaScript内存管理完全指南&#xff1a;从入门到精通1. 哪些数据类型属于引用类型&#xff08;复杂数据类型&#xff09;&#xff1f;2. 为什么引用类型要存储在堆中&#xff1f;3. 引用类型的内存存储示例示例 1&#xff1a;对象&#xff08;Object&#xff09;示例 …

Linux网络-------3.应⽤层协议HTTP

1.HTTP协议 虽然我们说,应⽤层协议是我们程序猿⾃⼰定的.但实际上,已经有⼤佬们定义了⼀些现成的,⼜⾮常好⽤的应⽤层协议,供我们直接参考使⽤.HTTP(超⽂本传输协议)就是其中之⼀。 在互联⽹世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超⽂本…

05 GWAS表型数据处理原理

表型数据处理 • 质量性状 – 二分类&#xff1a;可用0 / 1, 1 / 2 数值表示 – 多分类&#xff1a;哑变量赋值&#xff0c;0/1 • 数量性状 – 尽量符合正太分布 – 剔除异常表型值样本 – 多年多点重复观测 – 对于阈值性状&#xff0c;分级数量化或哑变量赋值 R中 shapiro.t…

【Cpolar实现内网穿透】

Cpolar实现内网穿透业务需求第一步&#xff1a;准备工作1、关闭安全软件2、下载所需软件第二步&#xff1a;Nginx的配置第三步&#xff1a;使用cpolar实现内网穿透1、进入 https://dashboard.cpolar.com/get-started 注册&#xff0c;登录&#xff0c;完成身份证的实名认证2、下…

基于 JavaWeb+MySQL 的学院党费缴费系统

基于 JavaWeb 的学院党费缴费系统第 1 章绪论1.1 项目背景当今互联网发展及其迅速&#xff0c;互联网的便利性已经遍及到各行各业&#xff0c;惠及到每一个人&#xff0c;传统的缴费方式都需要每个人前往缴费点陆续排队缴费&#xff0c;不仅浪费大量了个人时间&#xff0c;而且…

LCGL基本使用

LVGC简介 light video Graphics Library (1)纯c与语言编程,将面向对象的思想植入c语言。 (2)轻量化图形库资源,人机交互效果好,在(ios Android QT)移植性较好,但是这些平台对硬件要求较高 lcgc工程搭建 工程源码的获取 获取工程结构 https://github.com/lvgl/lv_po…

嵌入式第十六课!!!结构体与共用体

一、结构体结构体是一种数据类型&#xff0c;它的形式是这样的&#xff1a;struct 结构体名{ 结构体成员语句1&#xff1b;结构体成员语句2&#xff1b;结构体成员语句3&#xff1b;}&#xff1b;举个例子&#xff1a;struct Student {int id;char name[20];float score…

java web 实现简单下载功能

java web 实现简单下载功能 项目结构├── src\ │ ├── a.txt │ └── com\ │ └── demo\ │ └── web\ │ ├── Cookie\ │ ├── download\ │ ├── homework\ │ ├── serv…

虚幻基础:模型穿模

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录模型穿模模型之间的阻挡是否正确设置模型是角色的组件&#xff1a;角色的组件不会与场景中其他的物体发生阻挡但可以发生重叠模型穿模 模型之间的阻挡是否正确设置 模型是角色的组件&#xff1a;角色的组件不会与场…

【Linux】linux基础开发工具(二) 编译器gcc/g++、动静态库感性认识、自动化构建-make/Makefile

文章目录一、gcc/g介绍二、gcc编译选项预处理编译汇编链接三个细节三、动静态库感性认识动静态库的优缺点四、自动化构建-make/Makefile背景知识初步上手Makefilemakefile的推导过程makefile语法一、gcc/g介绍 我们之前介绍了编辑器vim&#xff0c;可以让我们在linux上linux系统…

CentOS 7 上使用 Docker 安装 Jenkins 完整教程

目录 前言 准备工作 系统要求 检查系统信息 更新系统 安装Docker 第一步:卸载旧版本Docker(如果存在) 第二步:安装必要的软件包 第三步:添加Docker官方仓库 第四步:安装Docker CE 第五步:启动Docker服务 第六步:验证Docker安装 第七步:配置Docker用户权限…

30.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--公共代码--用户上下文会话

在前面的文章中&#xff0c;我们会看到使用ContextSession来获取当前用户的UserId和UserName。这篇文章我们就一起来看看如何实现ContextSession。 一、ContextSession的实现 我们在公共类库SP.Common中创建一个名为ContextSession的类&#xff0c;用于获取当前请求的用户信息。…

BaseDao

#### 10.1 DAO概念> DAO&#xff1a;Data Access Object&#xff0c;数据访问对象。 > > Java是面向对象语言&#xff0c;数据在Java中通常以对象的形式存在。一张表对应一个实体类&#xff0c;一张表的操作对应一个DAO对象&#xff01;>> 在Java操作数据库时&a…

USRP捕获手机/路由器数据传输信号波形(中)

目录&#xff1a; USRP捕获手机/路由器数据传输信号波形&#xff08;上&#xff09; USRP捕获手机/路由器数据传输信号波形&#xff08;中&#xff09; USRP捕获手机/路由器数据传输信号波形&#xff08;下&#xff09; 三、双工通信信号捕获 3.1 信号接收系统 5805e6Hz&a…

使用 Kiro AI IDE 3小时实现全栈应用Admin系统

Hello&#xff0c; 大家好&#xff0c;我是程序员海军, 全栈开发 |AI爱好者 &#xff5c; 独立开发。 之前我是采用Node生态开发的大模型以及MCP Server,大模型开发的生态主要是Python语言&#xff0c;为了更好的学习大模型开发&#xff0c;于是开了新坑。开始学习Python, 以及…

浏览器pdf、image显示

浏览器地址栏 pdf data:application/pdf;base64, data:application/pdf;base64,JVBERi0xLjcKJeLjz9MKMjMgMCBvYmoKPDwv image data:image/jpeg;base64, data:image/jpeg;base64,/9j/4Q3fRXhpZgAATU0AKgAAAAgABwE

《Linux运维总结:银河麒麟V10 SP3启动docker容器报错permission denied》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、环境信息 二、背景 1、使用docker启动一个nginx容器&#xff0c;报错信息如下&#xff1a; docker: Error response from…

PDF源码解析

PDF源码解析打开PDF解析PDF​0. 文件头关键信息解析技术原理图解文件头的重要性实际文件结构示例开发者注意事项历史背景1. 根目录整体结构关键字段解析核心概念解释实际应用场景完整对象关系图技术总结2. 页面树对象结构关键字段解析页面树工作原理技术要点总结实际应用3. 图像…

java开闭原则 open-closed principle

基本知识 1.核心思想&#xff1a;面向抽象编程 2.基本内涵&#xff1a;对修改关闭&#xff0c;对扩展开放 3.要求&#xff1a;尽可能不修改源码而是增加新功能 例子 以spring5核心原理与30个类手写实战中的为例 package com.gupaoedu.vip.design.principle.openclose;/*** Crea…

拥抱智慧物流时代:数字孪生技术的应用与前景

概述 在数字经济全面推进的当下&#xff0c;物流行业正经历着前所未有的智能化升级。作为新一代信息技术的重要代表&#xff0c;数字孪生技术正悄然改变着物流的运作方式和决策模式。所谓数字孪生&#xff0c;是指在虚拟空间中创建与现实物流系统高度一致的数字模型&#xff0…