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

Leetcode 3568. Minimum Moves to Clean the Classroom

  • Leetcode 3568. Minimum Moves to Clean the Classroom
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3568. Minimum Moves to Clean the Classroom

1. 解题思路

这一题我的核心思路就是广度优先遍历遍历+剪枝。

显然,我们可以给出一个广度优先遍历来给出所有可能的走法直至无法继续或者捡完所有垃圾。

但是,上述情况事实上可能会无限循环下去,而且所有的走法也非常浪费,因此,我们需要对其进行剪枝,从而优化我们的计算。

而这里,我的剪枝思路就是:

  • 如果一个点曾经走过,则当他重新回到这个点的时候,他必须满足以下两个条件之一,否则这条路线必然不会是最优的,可以直接忽略:
    • 他在中间的过程中捡过了新的垃圾;
    • 他在中间的过程中补充了能量(即回来时的能量值大于之前来的时候的能量值)

由此,我们就能对上述问题进行解答了。

2. 代码实现

给出python代码实现如下:

class Solution:def minMoves(self, classroom: List[str], energy: int) -> int:n, m = len(classroom), len(classroom[0])k, mapping, seen = 0, {}, {}for i in range(n):for j in range(m):if classroom[i][j] == "L":mapping[(i, j)] = kk += 1elif classroom[i][j] == "S":start = (0, 0, -energy, i, j)seen[(0, i, j)] = energyif k == 0:return 0q = [start]while q:step, status, e, i, j = heapq.heappop(q)status = -statuse = -eif status == (2**k)-1:return stepelif e <= 0:continueif i-1 >= 0 and classroom[i-1][j] != "X":new_status = status if classroom[i-1][j] != "L" else status | (1 << mapping[(i-1, j)])new_energy = e-1 if classroom[i-1][j] != "R" else energyif seen.get((new_status, i-1, j), -1) < new_energy:heapq.heappush(q, (step+1, -new_status, -new_energy, i-1, j))seen[(new_status, i-1, j)] = new_energyif i+1 < n and classroom[i+1][j] != "X":new_status = status if classroom[i+1][j] != "L" else status | (1 << mapping[(i+1, j)])new_energy = e-1 if classroom[i+1][j] != "R" else energyif seen.get((new_status, i+1, j), -1) < new_energy:heapq.heappush(q, (step+1, -new_status, -new_energy, i+1, j))seen[(new_status, i+1, j)] = new_energyif j-1 >= 0 and classroom[i][j-1] != "X":new_status = status if classroom[i][j-1] != "L" else status | (1 << mapping[(i, j-1)])new_energy = e-1 if classroom[i][j-1] != "R" else energyif seen.get((new_status, i, j-1), -1) < new_energy:heapq.heappush(q, (step+1, -new_status, -new_energy, i, j-1))seen[(new_status, i, j-1)] = new_energyif j+1 < m and classroom[i][j+1] != "X":new_status = status if classroom[i][j+1] != "L" else status | (1 << mapping[(i, j+1)])new_energy = e-1 if classroom[i][j+1] != "R" else energyif seen.get((new_status, i, j+1), -1) < new_energy:heapq.heappush(q, (step+1, -new_status, -new_energy, i, j+1))seen[(new_status, i, j+1)] = new_energyreturn -1

提交代码评测得到:耗时3097ms,占用内存58.28MB。

http://www.lryc.cn/news/2395489.html

相关文章:

  • Kafka多线程Consumer
  • 从零开始的git学习
  • 【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)
  • Spring Boot 整合 JdbcTemplate,JdbcTemplate 与 MyBatis 的区别
  • sass基础语法
  • 【EF Core】 EF Core 批量操作的进化之路——从传统变更跟踪到无跟踪更新
  • [Go] Option选项设计模式 — — 编程方式基础入门
  • Vue 项目命名规范指南
  • 【笔记】开源通用人工智能代理 Suna 部署全流程准备清单(Windows 系统)
  • 海康工业相机SDK二次开发(VS+QT+海康SDK+C++)
  • 前端面试准备-5
  • Spring Boot 启动流程深度解析:从源码到实践
  • 深度学习|pytorch基本运算-乘除法和幂运算
  • 嵌入式通用集成电路卡市场潜力报告:物联网浪潮下的机遇与挑战剖析
  • 4.2.4 Spark SQL 数据写入模式
  • 论文笔记: Urban Region Embedding via Multi-View Contrastive Prediction
  • Android 缓存应用冻结器(Cached Apps Freezer)
  • 初学者如何微调大模型?从0到1详解
  • 西瓜书第十一章——降维与度量学习
  • Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家
  • NanoGPT的BenchMarking.py
  • 测试用例及黑盒测试方法
  • CentOS 7 环境下部署 LAMP
  • vscode实用配置
  • React 项目中封装 Excel 导入导出组件:技术分享与实践
  • 【PhysUnits】15.1 引入P1后的加一特质(add1.rs)
  • 【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来
  • python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名
  • Vue-2-前端框架Vue基础入门之二
  • CPT208 Human-Centric Computing 人机交互 Pt.7 交互和交互界面