YTU 3166 共享单车 DFS 记忆化搜索
问题 D: 共享单车
题目描述
共享单车走进烟台,小明决定尝试。小明启动共享单车 App,轻松地找到附近的单车。那么问题来了,到最近的那辆单车,小明大约要走多少米呢?
现在简化问题。将地图设定成一个由 100×100 米的像素块组成的二维平面区域。如果一个方块内有单车,则像素块显示为字符 x;如果此方块内是可以通行的路,则显示为 .;再如果方块是建筑物,则显示为 *,建筑物不能通行。
小明在地图上的位置显示为 o,可以朝,“上”、“下”、“左”,“右”,“左上”,“左下”,“右上”,“右下”八个方向走。下图所示为一个小明站在像素方块 O,如果小明向右走到 X,则走 100 米;如果向右上走,则走 141 米(不需要开方)。
假设小明和单车都在方块的中央。现在给出 T 幅根据以上规则建立的地图,地图行数和列数分别为 n 和 m,请分别估算小明要走多少米才能到最近的单车?
给出的地图中至少有一辆单车,如果最终无法到达单车的位置,输出 -1。
输入
第 1 行 T,表示下面有 T 组测试数据
对于每组测试数据
第 1 行 n 和 m,表示地图的大小;
第 2 行开始,给出具体的地图 。
输出
T 行数据
每行 1 个整数,表示问题的解
输入输出样例
样例输入 #1
复制
2
3 8
.....x..
.o...x..
........
8 10
.***......
.***......
.***..x...
..........
.....*****
..o..*****
.......x..
...*******
样例输出 #1
复制
400
523
提示
如果计算中出现小数,那么直接舍弃。最后的输出的结果为整型。
记忆化搜索:
记忆化搜索是深搜的一种剪枝策略,记忆化搜索就是让程序记住一些东西,然后在需要时可以快速调用,用什么来存贮数据?用数组
记忆化搜索是在搜索过程中,会有很多重复计算,如果我们能记录一些状态的答案,就可以减少复搜索量
记忆化搜索的核心实现:
1.首先,要通过一个数组记录已经存储下的搜索结果
2.状态表示,由于是要用数组实现,所以状态最好可以用数字表示,
3.在每一状态搜索的开始,高效的使用数组查看这个状态是否出现过,如果已经做过,直接调用答案,如果没有,则按正常方法搜索
以斐波那契数列为例,记忆化代码入下:
int memorize[N]; //保存结果
int fib(int n)
{if(n==1 || n==2) return 1; if(memorize[n]!=0) return memorize[n]; //直接返回保存的结果,不再递归memorize[n]=fib(n-1)+fib(n-2); //递归计算结果,并记忆return memorize[n];
}
在这段代码中,一个斐波那契数列只计算一次,所以总时间复杂度为O(n)
我们先用一道熟悉的题目引入记忆化搜索:
https://blog.csdn.net/2302_79545206/article/details/137286031?spm=1001.2014.3001.5501
思路:
从o点出发,要寻找距离最近的共享单车,因为要求最近距离,我们初始化距离为无穷远,用一个d数组来记录个点距离o点的最短距离,并初始化为无穷大,每次进行下一次dfs之前,首先先进行判断走这一步是否可以使到达我们要到达的点的距离更近,这样进入dfs便可以直接更新,找到一个共享单车,做比较寻找最优解。
代码实现:
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>using namespace std;typedef long long ll;typedef pair<int,int> PII;const int INF=0x3f3f3f3f;
const int N=105;char g[N][N];
bool vis[N][N];int ans=INF;
bool f=false;
int n,m;int d[N][N];///记忆化搜索int xx,yy;void dfs(int x,int y,int dis)///(x,y)记录点的位置,dis记录该点距离o点的距离
{if(x<1 || x>n || y<1 || y>m) return;///判断点是否越界d[x][y]=dis; /// 更新最短距离,因为已经做过判断了,所以这里直接更新if(g[x][y]=='x')///找到共享单车{f=true;ans=min(ans,d[x][y]);///选择距离更近的最优解return;}else{if(!vis[x+1][y] && dis+100<d[x+1][y] && g[x+1][y]!='*') ///右{vis[x+1][y]=true;dfs(x+1,y,dis+100);vis[x+1][y]=false;}if(!vis[x-1][y] && dis+100<d[x-1][y] && g[x-1][y]!='*') ///左{vis[x-1][y]=true;dfs(x-1,y,dis+100);vis[x-1][y]=false;}if(!vis[x][y+1] && dis+100<d[x][y+1] && g[x][y+1]!='*') ///上{vis[x][y+1]=true;dfs(x,y+1,dis+100);vis[x][y+1]=false;}if(!vis[x][y-1] && dis+100<d[x][y-1] && g[x][y-1]!='*') ///下{vis[x][y-1]=true;dfs(x,y-1,dis+100);vis[x][y-1]=false;}if(!vis[x-1][y-1] && dis+141<d[x-1][y-1] && g[x-1][y-1]!='*') ///左下{vis[x-1][y-1]=true;dfs(x-1,y-1,dis+141);vis[x-1][y-1]=false;}if(!vis[x+1][y+1] && dis+141<d[x+1][y+1] && g[x+1][y+1]!='*') ///右上{vis[x+1][y+1]=true;dfs(x+1,y+1,dis+141);vis[x+1][y+1]=false;}if(!vis[x-1][y+1] && dis+141<d[x-1][y+1] && g[x-1][y+1]!='*') ///左上{vis[x-1][y+1]=true;dfs(x-1,y+1,dis+141);vis[x-1][y+1]=false;}if(!vis[x+1][y-1] && dis+141<d[x+1][y-1] && g[x+1][y-1]!='*') ///右下{vis[x+1][y-1]=true;dfs(x+1,y-1,dis+141);vis[x+1][y-1]=false;}}return;
}void solve()
{cin>>n>>m;ans=INF;///初始化memset(d,0x3f,sizeof(d)); ///初始化图上每个点到小明的距离为无穷远f=false;///不能到达共享单车memset(vis,false,sizeof(vis));///因为是多组数据输入输出因此要初始化for(int i=1; i<=n; i++)///图的存储{for(int j=1; j<=m; j++){cin>>g[i][j];if(g[i][j]=='o'){xx=i;yy=j;}}}dfs(xx,yy,0);///从o点开始搜索if(f==false) printf("-1\n");else cout<<ans<<endl;}int main()
{int T;cin>>T;while(T--){solve();}return 0;
}
相关文章:
YTU 3166 共享单车 DFS 记忆化搜索
问题 D: 共享单车 题目描述 共享单车走进烟台,小明决定尝试。小明启动共享单车 App,轻松地找到附近的单车。那么问题来了,到最近的那辆单车,小明大约要走多少米呢? 现在简化问题。将地图设定成一个由 100100 米的像…...
RAG应用中的路由模式
依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。 对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,…...
运维:SSH常用命令简介
SH,全称为Secure Shell,是建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。通过 SSH 可以对所有传输的数据进行加密&…...
Springboot+Vue项目-基于Java+MySQL的流浪动物管理系统(附源码+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…...
力扣刷题:四数相加Ⅱ
题目详情: 解法一:暴力枚举 对于这道题,我们的第一思路就是暴力枚举,我们可以写一个四层的for循环进行暴力匹配,只要相加的结果等于0就进行统计。但是我们会发现,我们的事件复杂度为O(N^4)事件复杂度非常大…...
如果通过Glide 设置图片圆角
要给图片设置一个圆角,通常方法是在ImageView 标签外添加一个CardView 标签,然后设置圆角值,但是今天遇到一个问题就是 RecyclerView Item 中这样操作的话会遇到这样的一个报错: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.rec…...
Chatgpt学习技巧
论文润色指令 论文润色常用指令 通用话术: Below is a paragraph from an academic paper. Polish the writing to meet the academic style, improve the spelling, grammar, clarity, concision and overall readability. When necessary, rewrite the whole se…...
[初学rust] 06_rust 元组
rust 元组 表现形式 和python的元组类似,rust中的元组是一个有序列表,可以包含多种不同类型的数据。 let tup (500, 6.4, a);模式匹配解构元组 和python中的解构一样,rust也支持模式匹配解构元组,但是需要注意的是࿰…...
基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四)
基于 LlaMA 3 LangGraph 在windows本地部署大模型 (四) 大家继续看 https://lilianweng.github.io/posts/2023-06-23-agent/的文档内容 第三部分:工具使用 工具的使用是人类的一个显着而显着的特征。我们创造、修改和利用外部物体来完成超…...
C++进阶:哈希(1)
目录 1. 简介unordered_set与unordered_map2. 哈希表(散列)2.1 哈希表的引入2.2 闭散列的除留余数法2.2.1 前置知识补充与描述2.2.2 闭散列哈希表实现 2.3 开散列的哈希桶2.3.1 结构描述2.3.2 开散列哈希桶实现2.3.3 哈希桶的迭代器与key值处理仿函数 3.…...
第三节课,功能2:开发后端用户的管理接口-- postman--debug测试
一、如何使用postman 网址: https://www.postman.com/downloads/ 【Postman小白教程】五分钟学会如何使用Postman~_哔哩哔哩_bilibili postman安装使用_bowser agent在postman哪里-CSDN博客 二、下载后 登录,开始测试 2.1 关于postman 报错&#…...
Docker-compsoe部署prysm-beacon-chain + geth服务(geth版本v1.14.0)
1、创建目录结构 ~ # mkdir -p /data/docker-compose/eth ~ # cd /data/docker-compose/eth /data/docker-compose/eth# mkdir beacondata eth ethdata prysm2、编写prysm-beacon-chain Dockerfile和启动脚本文件 /data/docker-compose/eth# vim Dockerfile /data/docker-…...
前端人员如何理解进程和线程
进程和线程的概念: 进程和线程本质都是cpu工作过程的时间片。 进程可以理解为cpu在运行指令即加载保存上下文所要用的时间。也可以理解为一个应用程序运行的实例。 线程是进程中更小的单位,描述一段指令所需要的时间。 进程是资源分配的最小单位…...
Linux下网络命令
目录 需求1-查看本机是否存在22端口解法1解法2解法3 需求2-查看其他主机是否存在22端口解法1解法2解法3 需求3-查看TCP连接解法1/2 需求4-统计80端口tcp连接次数解法 需求5-查看总体网络速度解法 需求6-查看进程流量解法 需求7-dns解法 需求8-traceroute到baidu解法 需求9-查看…...
Php swoole和mqtt
在 PHP 中使用 Swoole 处理 MQTT 订阅消息是一种高效的方式,可以充分利用 Swoole 协程的非阻塞特性和高性能 I/O 处理能力。下面是一个示例代码,演示了如何使用 Swoole 的 MQTT 客户端来订阅消息,并加以详细说明。 1. 安装 Swoole 首先&…...
Spring STOMP-连接到消息代理
STOMP 代理中继维护一个与消息代理的“系统”TCP 连接。这个连接仅用于来自服务器端应用程序的消息,不用于接收消息。您可以为此连接配置STOMP凭据(即STOMP帧的login和passcode头部)。这在XML命名空间和Java配置中都以systemLogin和systemPas…...
Excel中的`MMULT`函数
Excel中的MMULT函数是一个用于执行矩阵乘法运算的函数。矩阵乘法是线性代数中的一个基本运算,它允许我们计算两个矩阵的乘积,得到一个新的矩阵。与普通的标量乘法不同,矩阵乘法涉及到行与列的对应元素相乘然后求和的过程。MMULT函数在进行数据…...
孩子多大可以接触python?学习python的好处
孩子接触Python的年龄并没有明确的界限,一般来说,6岁以上的孩子可以开始学习Python编程。虽然Python是一门高级编程语言,但它的语法简单易懂,适合初学者入门。通过学习Python编程,孩子可以培养逻辑思维、创造力和解决问…...
四川汇昌联信:拼多多网点怎么开?大概需要多少钱?
想要开一家拼多多网点,你肯定很关心需要准备多少资金。下面,我们就来详细解答这个问题,并从多个角度分析开设网点的要点。 一、 开设拼多多网点,首要任务是确定启动资金。根据不同的经营模式和地区差异,成本会有所不同…...
ROS 2边学边练(43)-- 利用GTest写一个基本测试(C++)
前言 在ROS(Robot Operating System)中,gtest(Google Test)是一个广泛使用的C测试框架,用于编写和执行单元测试。这些测试可以验证ROS节点、服务和消息等的正确性和性能。 如果我们需要在写的包中添加测试&…...
极速净化Windows 11:Win11Debloat一键释放系统潜能
极速净化Windows 11:Win11Debloat一键释放系统潜能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and custo…...
2026年AI智能算力服务研究报告:HBM、CPO与重构|附240+份报告PDF、数据、可视化模板汇总下载
全文链接:https://tecdat.cn/?p45901原文出处:拓端抖音号拓端tecdat封面:摘要本文聚焦2026年算力行业核心增长引擎,深度解析HBM高带宽内存与CPO共封装光学技术的产业化进程。报告回答三个核心问题:1)未来3…...
树莓派Zero轻量级数字孪生:Unity实现嵌入式机器人3D可视化控制
1. 这不是“玩具演示”,而是嵌入式机器人开发的数字孪生入口你有没有遇到过这样的场景:手头是一台树莓派Zero驱动的四轮差速小车,电机驱动板接好了,编码器信号也引出来了,PID参数调了三天还是抖得像筛糠;或…...
手把手教你用N32G435的DMA‘传输过半中断’实现软件双缓冲(附2.5M波特率测试代码)
N32G435 DMA传输过半中断实现高负载串口通信的工程实践 在嵌入式系统开发中,高效处理高速串口数据流一直是工程师面临的挑战。当数据速率达到兆波特级别时,传统的中断驱动方式往往会导致CPU资源耗尽,系统响应迟缓。本文将深入探讨如何利用N32…...
超自动化巡检:破解运维人员短缺的利器
在数字化转型加速推进的今天,企业IT基础设施正经历着前所未有的指数级增长——物理服务器、虚拟机、容器集群、云原生环境、边缘节点……运维对象的数量与种类日新月异。然而,与之形成鲜明对比的是,运维团队的规模却难以等比扩充。招不到人、…...
到底什么是 AI 测试?AI 测试与传统测试的区别?
过去两年,AI已经从"加分项"变成了"必选项"。 不只是大厂,二线公司、甚至传统行业的测试团队都在要求:"能熟练使用AI工具提效"。 更关键的是,面试的玩法也变了。现在的技术面试早就跳出了 “考 AI 零…...
Unity安装配置全链路排坑指南:从下载到首建成功
1. 这不是“装个软件”那么简单:Unity安装背后的真实战场很多人点开Unity官网,看到那个醒目的“Download”按钮,下意识觉得:“不就是点几下、选个路径、等十分钟?”——我带过三届Unity方向的实习团队,每年…...
AI资讯简报如何成为工程师的技术决策雷达
1. 项目概述:一份真正“够用”的AI资讯简报,到底长什么样?“This AI newsletter is all you need #26”——光看标题,你可能以为这是某家科技媒体的常规栏目更新。但在我连续跟踪拆解了它前25期、并实际用它指导自己团队技术选型和…...
SAR遥感技术:全天候农业监测的实践指南与数据融合
1. 项目概述:从“看”到“感知”,SAR如何革新农业监测在农业监测领域,我们传统上极度依赖光学卫星图像,比如大家熟知的Landsat、Sentinel-2,它们提供的NDVI(归一化差异植被指数)图几乎成了判断作…...
CPU核心存储架构:寄存器文件与SRAM的设计原理与应用对比
1. 项目概述:从“存储”到“访问”的核心差异在处理器设计的核心地带,有两个名字听起来很像、功能也似乎都是“存东西”的组件,却常常让刚入行的朋友感到困惑:Register File(寄存器文件)和 SRAM(…...
