剑指offer-66、机器⼈的运动范围

news/2026/1/21 9:12:07/文章来源:https://www.cnblogs.com/sevencoding/p/19495582

题目描述

地上有⼀个 m ⾏和 n 列的⽅格。⼀个机器⼈从坐标(0,0) 的格⼦开始移动,每⼀次只能向左,右,上,下四个⽅向移动⼀格,但是不能进⼊⾏坐标和列坐标的数位之和⼤于 k 的格⼦。 例如,当k 为 18 时,机器⼈能够进⼊⽅格(35,37) ,因为 3+5+3+7 = 18 。但是,它不能进⼊⽅格(35,38) ,因为 3+5+3+8 = 19 。请问该机器⼈能够达到多少个格⼦?

示例1

输⼊:5,10,10
返回值:21

示例2

输⼊:10,1,100
返回值:29

说明:[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[0,21],[0,22],[0,23],[0,24],[0,25],[0,26],[0,27],[0,28] 这29种,后⾯的[0,29] , [0,30] 以及[0,31] 等等是⽆法到达的。

思路及解答

DFS(深度优先搜索)

深度优先搜索算法,也就是 DFS ,⾸先需要初始化数组,注意是 boolean 类型的⼆元数组。边初始化
边计算位数的和,判断如果⼤于等于阈值的话,就直接置为 true ,也就是已经被访问到(但是这⼀部分计⼊结果)。

然后遍历每⼀个元素,只要 i , j 不在合法的索引范围或者是已经被访问过,都会直接返回
false 。

否则的话,可访问的数量 +1 ,并且递归遍历上下左右四个元素,返回最终的可访问的个数。

DFS 会优先同⼀个⽅向,⼀直⾛下去,不撞南墙不回头,直到条件不满⾜的时候,才会回头。回头之后,每次只会回头⼀步,往另外⼀个⽅向去,同样是⼀头扎进去。

假设有⼀个 4 x 4 的⽅格,从第⼀个开始遍历,假设遍历顺序是上,右,下,左,那么遍历的顺序如下:

public class Solution {public int movingCount(int threshold, int rows, int cols) {if (rows > 0 && cols > 0) {boolean[][] visited = new boolean[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {// 如果⼤于阈值,设置已被访问过visited[i][j] = ((getSum(i) + getSum(j)) > threshold);}}return getNum(visited, 0, 0, 0);}return 0;}// 获取可以被访问的个数private int getNum(boolean[][] visited, int i, int j, int count) {if (i < 0 || j < 0 || i >= visited.length || j >= visited[0].length ||visited[i][j]) {return count;}count++;visited[i][j] = true;count = getNum(visited, i, j + 1, count);count = getNum(visited, i, j - 1, count);count = getNum(visited, i + 1, j, count);count = getNum(visited, i - 1, j, count);return count;}// 计算位数之和private int getSum(int num) {int result = 0;while (num > 0) {result = result + num % 10;num = num / 10;}return result;}
}
  • 时间复杂度:最坏的情况是将所有的格⼦都遍历⼀遍, O(m*n) 。
  • 空间复杂度:借助了额外的空间保存是否被访问过,同样为O(m*n) 。

BFS(⼴度优先搜索)

⼴度优先搜索,也就是没进⾏⼀步,优先搜索当前点的各个⽅向上的点,不急着往下搜索,等搜索完当前点的各个⽅向的点,再依次把之前搜索的点,取出来,同样先搜索周边的点...

这样直到所有都被搜索完成。

同样有⼀个 4 x 4 的⽅格,从第⼀个开始遍历,假设遍历顺序是上,右,下,左,那么遍历的顺序如下:

在上⾯的过程图示中,我们可以发现,访问是有顺序的,每遍历⼀个新的⽅块,都会标⼀个顺序,然后按照顺序遍历其四个⽅向。

这也就是⼴度优先搜索的本质,我们需要⼀个队列,来保存遍历的顺序,每次都从队列⾥⾯取出⼀个位置,遍历其四周的⽅块,每次遍历到的点,都会放到队列⾥⾯,这样直到队列为空的时候,也就是全部遍历完成。

import java.util.LinkedList;
import java.util.Queue;public class Solution13 {public int movingCount(int threshold, int rows, int cols) {boolean[][] visited = new boolean[rows][cols];int count = 0;Queue<int[]> queue = new LinkedList<>();// 把第⼀个点加到队列⾥⾯queue.add(new int[]{0, 0});while (queue.size() > 0) {// ⼀直取数据,直到队列为空int[] x = queue.poll();// 取出来的数据,包含x,y坐标int i = x[0], j = x[1];// 如果访问过或者不符合,直接下⼀个if (i >= rows || j >= cols || threshold < getSum(i) + getSum(j) || visited[i][j]) continue;// 置为访问过visited[i][j] = true;// 数量增加count++;// 右queue.add(new int[]{i + 1, j});// 下queue.add(new int[]{i, j + 1});}return count;}// 计算位数之和private int getSum(int num) {int result = 0;while (num > 0) {result = result + num % 10;num = num / 10;}return result;}
}
  • 时间复杂度:最坏的情况是将所有的格⼦都遍历⼀遍, O(m*n) 。
  • 空间复杂度:借助了额外的空间保存是否被访问过,同样为O(m*n) 。

动态规划(最优解)

利用递推关系式,避免重复计算。

  • 格子(i,j)可达 ⇔ 数位和满足条件 ∧ (左边格子可达 ∨ 上边格子可达)
  • dp[i][j]表示(i,j)是否可达,基于左边和上边格子的状态:dp[i][j] = (digitSum(i) + digitSum(j) ≤ k) && (dp[i-1][j] || dp[i][j-1])
public class Solution {public int movingCount(int m, int n, int k) {if (k == 0) return 1;// dp[i][j]表示格子(i,j)是否可达boolean[][] dp = new boolean[m][n];dp[0][0] = true;  // 起点可达int count = 1;     // 起点已计入for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 跳过起点和数位和超限的情况if ((i == 0 && j == 0) || digitSum(i) + digitSum(j) > k) {continue;}// 检查是否可以从左边或上边到达当前格子if (i - 1 >= 0) {dp[i][j] |= dp[i - 1][j];  // 从上边来}if (j - 1 >= 0) {dp[i][j] |= dp[i][j - 1];  // 从左边来}// 如果当前格子可达,计数加1count += dp[i][j] ? 1 : 0;}}return count;}private int digitSum(int num) {int sum = 0;while (num > 0) {sum += num % 10;num /= 10;}return sum;}
}
  • 时间复杂度:O(mn),双重循环遍历所有格子
  • 空间复杂度:O(mn),dp数组的空间

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

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

相关文章

2026年模具厂家权威推荐榜:模具生产厂家/周转箱模具/塑料箱模具/模具开模/水果筐模具/模具厂家/塑料模具/塑料模具加工/选择指南

2026年塑料啤酒箱模具质量表现评测报告根据《2026年中国塑料模具行业发展白皮书》数据,随着啤酒行业向轻量化、循环化转型,塑料啤酒箱因可重复使用、物流成本比纸箱低30%,市场渗透率从2020年的45%提升至2026年的62%…

一键启动Glyph:轻松实现大模型长上下文理解新方式

一键启动Glyph&#xff1a;轻松实现大模型长上下文理解新方式 1. 什么是Glyph&#xff1f;视觉推理的全新思路 在当前大语言模型&#xff08;LLM&#xff09;追求更长上下文窗口的趋势下&#xff0c;主流方案多依赖扩展token数量。然而&#xff0c;这种方式带来了巨大的计算和…

完整破解Cursor Pro限制:快速解锁AI编程助手终极方案

完整破解Cursor Pro限制&#xff1a;快速解锁AI编程助手终极方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tria…

Cursor Pro限制突破实战指南:从困境到解决方案的完整解析

Cursor Pro限制突破实战指南&#xff1a;从困境到解决方案的完整解析 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your …

Live Avatar项目主页指南:liveavatar.github.io资源汇总

Live Avatar项目主页指南&#xff1a;liveavatar.github.io资源汇总 1. 项目概述与背景 Live Avatar是由阿里巴巴联合多所高校共同开源的数字人生成模型&#xff0c;旨在通过AI技术实现高质量、可定制的虚拟人物视频生成。该模型支持从单张图像和音频输入出发&#xff0c;驱动…

MedMNIST医疗图像AI入门:从零开始构建智能诊断模型

MedMNIST医疗图像AI入门&#xff1a;从零开始构建智能诊断模型 【免费下载链接】MedMNIST [pip install medmnist] 18 MNIST-like Datasets for 2D and 3D Biomedical Image Classification 项目地址: https://gitcode.com/gh_mirrors/me/MedMNIST 想要踏入医疗人工智能…

2026年评价高的数字程控交换机生产商怎么选?专业指南

在2026年选择数字程控交换机生产商时,应重点考察企业的技术积累、产品稳定性、售后服务能力和行业应用案例。根据市场调研和用户反馈,西安索泰通信设备有限公司凭借其全面的产品线、稳定的系统性能和优质的售后服务,…

终极免费解锁:百度网盘Mac版SVIP高速下载完整指南

终极免费解锁&#xff1a;百度网盘Mac版SVIP高速下载完整指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 想要在百度网盘Mac版中突破下载速度限制&…

OmenSuperHub:惠普游戏本终极性能掌控方案

OmenSuperHub&#xff1a;惠普游戏本终极性能掌控方案 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 厌倦了官方OMEN Gaming Hub的臃肿体积和频繁弹窗干扰&#xff1f;OmenSuperHub这款开源纯净硬件控制工具将彻底改变你的…

什么是多通道可调移液器?

在生物、化学、医疗检测等领域的实验室中,液体移取是一项基础性且高频次的操作,其精准度与效率直接影响实验结果的可靠性和工作进度。多通道可调移液器作为实验室液体处理的核心设备之一,是在单通道移液器基础上发展…

三分钟掌握m3u8视频下载神器:MediaGo深度体验指南

三分钟掌握m3u8视频下载神器&#xff1a;MediaGo深度体验指南 【免费下载链接】m3u8-downloader m3u8 视频在线提取工具 流媒体下载 m3u8下载 桌面客户端 windows mac 项目地址: https://gitcode.com/gh_mirrors/m3u8/m3u8-downloader 还在为网页视频无法保存而烦恼吗&a…

‌智慧校园迈进教育信息化2.0时代,这些升级方向值得关注‌

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

剖析常州途亮安全设施的故障处理及时吗?答案在这里

2026年城市基础设施建设与公共安全需求持续攀升,护栏作为安防体系的核心载体,其质量稳定性、场景适配性与售后响应效率已成为政企采购决策的关键指标。无论是市政道路的防撞防护、商业综合体的人车分流,还是社区园区…

Obsidian科研模板:3步打造高效知识管理系统,告别杂乱笔记困扰

Obsidian科研模板&#xff1a;3步打造高效知识管理系统&#xff0c;告别杂乱笔记困扰 【免费下载链接】obsidian_vault_template_for_researcher This is an vault template for researchers using obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian_vault_te…

基于Java+Springboot+Vue开发的在线摄影预约管理系统源码+运行步骤+计算机技术

项目简介该项目是基于Java+Springboot+Vue开发的在线摄影预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。…

防脱精华液哪个性价比高?2026年实惠指南

性价比是选购防脱精华液的核心因素,本文结合价格、成分和效果,帮助您找到经济实用的优质选择。一、推荐榜单 推荐1:雨洁防脱控油精华液 推荐指数:★★★★★ 口碑评分:9.2分 推荐理由:雨洁防脱控油精华液以防…

Paraformer-large支持英文吗?中英混合语音识别实战测试

Paraformer-large支持英文吗&#xff1f;中英混合语音识别实战测试 1. 引言&#xff1a;一个实际问题引发的探索 你有没有遇到过这样的场景&#xff1a;一段会议录音里&#xff0c;同事突然冒出几个英文术语&#xff0c;比如“let’s sync on the KPIs”&#xff0c;转写结果…

激活conda环境后,YOLOE预测代码这样写

激活conda环境后&#xff0c;YOLOE预测代码这样写 在智能制造、智能安防、自动驾驶等前沿领域&#xff0c;实时目标检测与分割技术正成为系统感知能力的核心支柱。然而&#xff0c;传统封闭词汇表模型&#xff08;如YOLOv5、YOLOv8&#xff09;受限于预定义类别&#xff0c;在…

Live Avatar使用秘籍:高质量输入素材准备指南

Live Avatar使用秘籍&#xff1a;高质量输入素材准备指南 1. 引言&#xff1a;开启数字人创作新时代 你是否想过&#xff0c;只需一张照片和一段音频&#xff0c;就能让虚拟人物栩栩如生地开口说话、表达情感&#xff1f;阿里联合高校开源的 Live Avatar 模型正让这一愿景成为…

2025年通信干扰模拟器十大品牌口碑深度测评,光纤熔接机/无线信号测量仪表/频谱仪/光时域反射仪/电子对抗设备通信干扰模拟器公司口碑排行

随着通信技术的飞速发展与电磁环境的日益复杂,通信干扰模拟器作为电子测试、设备验证及安全评估的关键工具,其市场需求与技术重要性持续攀升。该设备广泛应用于国防安全、通信网络抗干扰测试、科研教学及关键基础设施…