当前位置: 首页 > news >正文

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: 共享单车 题目描述 共享单车走进烟台&#xff0c;小明决定尝试。小明启动共享单车 App&#xff0c;轻松地找到附近的单车。那么问题来了&#xff0c;到最近的那辆单车&#xff0c;小明大约要走多少米呢&#xff1f; 现在简化问题。将地图设定成一个由 100100 米的像…...

RAG应用中的路由模式

依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。 对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,…...

运维:SSH常用命令简介

SH&#xff0c;全称为Secure Shell&#xff0c;是建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。通过 SSH 可以对所有传输的数据进行加密&…...

Springboot+Vue项目-基于Java+MySQL的流浪动物管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

力扣刷题:四数相加Ⅱ

题目详情&#xff1a; 解法一&#xff1a;暴力枚举 对于这道题&#xff0c;我们的第一思路就是暴力枚举&#xff0c;我们可以写一个四层的for循环进行暴力匹配&#xff0c;只要相加的结果等于0就进行统计。但是我们会发现&#xff0c;我们的事件复杂度为O(N^4)事件复杂度非常大…...

如果通过Glide 设置图片圆角

要给图片设置一个圆角,通常方法是在ImageView 标签外添加一个CardView 标签,然后设置圆角值,但是今天遇到一个问题就是 RecyclerView Item 中这样操作的话会遇到这样的一个报错: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.rec…...

Chatgpt学习技巧

论文润色指令 论文润色常用指令 通用话术&#xff1a; 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的元组类似&#xff0c;rust中的元组是一个有序列表&#xff0c;可以包含多种不同类型的数据。 let tup (500, 6.4, a);模式匹配解构元组 和python中的解构一样&#xff0c;rust也支持模式匹配解构元组&#xff0c;但是需要注意的是&#xff0…...

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;四&#xff09; 大家继续看 https://lilianweng.github.io/posts/2023-06-23-agent/的文档内容 第三部分&#xff1a;工具使用 工具的使用是人类的一个显着而显着的特征。我们创造、修改和利用外部物体来完成超…...

C++进阶:哈希(1)

目录 1. 简介unordered_set与unordered_map2. 哈希表&#xff08;散列&#xff09;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 网址&#xff1a; https://www.postman.com/downloads/ 【Postman小白教程】五分钟学会如何使用Postman~_哔哩哔哩_bilibili postman安装使用_bowser agent在postman哪里-CSDN博客 二、下载后 登录&#xff0c;开始测试 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-…...

前端人员如何理解进程和线程

进程和线程的概念&#xff1a; 进程和线程本质都是cpu工作过程的时间片。 进程可以理解为cpu在运行指令即加载保存上下文所要用的时间。也可以理解为一个应用程序运行的实例。 线程是进程中更小的单位&#xff0c;描述一段指令所需要的时间。 进程是资源分配的最小单位&#xf…...

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 订阅消息是一种高效的方式&#xff0c;可以充分利用 Swoole 协程的非阻塞特性和高性能 I/O 处理能力。下面是一个示例代码&#xff0c;演示了如何使用 Swoole 的 MQTT 客户端来订阅消息&#xff0c;并加以详细说明。 1. 安装 Swoole 首先&…...

Spring STOMP-连接到消息代理

STOMP 代理中继维护一个与消息代理的“系统”TCP 连接。这个连接仅用于来自服务器端应用程序的消息&#xff0c;不用于接收消息。您可以为此连接配置STOMP凭据&#xff08;即STOMP帧的login和passcode头部&#xff09;。这在XML命名空间和Java配置中都以systemLogin和systemPas…...

Excel中的`MMULT`函数

Excel中的MMULT函数是一个用于执行矩阵乘法运算的函数。矩阵乘法是线性代数中的一个基本运算&#xff0c;它允许我们计算两个矩阵的乘积&#xff0c;得到一个新的矩阵。与普通的标量乘法不同&#xff0c;矩阵乘法涉及到行与列的对应元素相乘然后求和的过程。MMULT函数在进行数据…...

孩子多大可以接触python?学习python的好处

孩子接触Python的年龄并没有明确的界限&#xff0c;一般来说&#xff0c;6岁以上的孩子可以开始学习Python编程。虽然Python是一门高级编程语言&#xff0c;但它的语法简单易懂&#xff0c;适合初学者入门。通过学习Python编程&#xff0c;孩子可以培养逻辑思维、创造力和解决问…...

四川汇昌联信:拼多多网点怎么开?大概需要多少钱?

想要开一家拼多多网点&#xff0c;你肯定很关心需要准备多少资金。下面&#xff0c;我们就来详细解答这个问题&#xff0c;并从多个角度分析开设网点的要点。 一、 开设拼多多网点&#xff0c;首要任务是确定启动资金。根据不同的经营模式和地区差异&#xff0c;成本会有所不同…...

ROS 2边学边练(43)-- 利用GTest写一个基本测试(C++)

前言 在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;gtest&#xff08;Google Test&#xff09;是一个广泛使用的C测试框架&#xff0c;用于编写和执行单元测试。这些测试可以验证ROS节点、服务和消息等的正确性和性能。 如果我们需要在写的包中添加测试&…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...