【LeetCode】Day212-机器人的运动范围
创始人
2025-06-01 10:38:23
0

题目

面试题13. 机器人的运动范围【中等】

题解

机器人每次只能移动一格,因此每次只需计算 x 到 x±1 的数位和增量

数位和增量公式:设x的数位和sxs_xsx​,x的数位和sx+1s_{x+1}sx+1​

  1. 当 (x+1)%10=0 时:sx+1=sx−8s_{x+1}=s_x-8sx+1​=sx​−8,例如19数位和10,20数位和2;
  2. 当 (x+1)%10≠0 时:sx+1=sx+1s_{x+1}=s_x+1sx+1​=sx​+1,例如1数位和1,2数位和2。

可达解分析:根据数位和增量公式得知,数位和每逢进位突变一次
因此可以将矩阵分为三个区域,黄色三角形区域内的解虽然满足数位和要求,但由于机器人每步只能走一个单元格,而三角形间不一定是连通的,因此机器人不一定能到达,称为不可达解。可到达的称为可达解
在这里插入图片描述
根据可达解的结构和连通性,易推出机器人可仅通过向右和向下移动,访问所有可达解

  • 三角形内部: 全部连通;
  • 两三角形连通处: 若某三角形内的解为可达解,则必与其左边或上边的三角形连通(即相交),即机器人必可从左边或者上边走进此三角形。

在这里插入图片描述

DFS

  • 递归参数:当前元素索引行 i 列 j ,两者的数位和si,sj
  • 终止条件:当 行列索引越界 or 数位和超出目标值k or 当前元素已访问过 时,返回0,不计入可达解。
  • 递推工作
    1.标记当前单元格:(i,j)存入Set visited 中,代表此单元格已被访问过。
    2.搜索下一单元格:计算当前元素的 下、右 两个方向元素的数位和,并开启下层递归。
  • 回溯返回值:返回 1+右方搜索可达解总数+下方搜索可达解总数 ,代表从本单元格递归搜索的可达解总数。
class Solution {int row,col,lim;boolean[][] visited;public int movingCount(int m, int n, int k) {row=m;col=n;lim=k;visited=new boolean[m][n];return dfs(0,0,0,0);}public int dfs(int i,int j,int si,int sj){if(i>=row||j>=col||si+sj>lim||visited[i][j])return 0;visited[i][j]=true;int newSi=(i+1)%10==0?si-8:si+1;//(i+1,j)数位和int newSj=(j+1)%10==0?sj-8:sj+1;//(i,j+1)数位和return 1+dfs(i+1,j,newSi,sj)+dfs(i,j+1,si,newSj);}
}

时间复杂度:O(mn)O(mn)O(mn)

空间复杂度:O(mn)O(mn)O(mn)

BFS

  • 初始化:初始点(0,0)加入队列queue;
  • 迭代终止条件:队列为空,表示已遍历完所有可达解。
  • 迭代工作
    1.单元格出队:队首单元格的 索引、数位和 弹出,作为当前搜索单元格。
    2.判断是否跳过:若 行列索引越界 or 数位和超过目标值k or 当前元素已访问过 时,执行continue。
    3.标记当前单元格:将单元格索引(i,j)存入Set visited 中,代表此单元格已被访问过。
    4.单元格入队:将当前元素的 下方、右方 单元格的索引、数位和加入queue。
  • 返回值:Set visited 的长度,即可达解的数量。
class Solution {public int movingCount(int m, int n, int k) {boolean[][] visited=new boolean[m][n];int res=0;Queuequeue=new LinkedList<>();queue.offer(new int[]{0,0,0,0});while(!queue.isEmpty()){int[] x=queue.poll();int i=x[0],j=x[1],si=x[2],sj=x[3];if(i>=m||j>=n||si+sj>k||visited[i][j])continue;visited[i][j]=true;res++;int newSi=(i+1)%10==0?si-8:si+1;int newSj=(j+1)%10==0?sj-8:sj+1;queue.offer(new int[]{i+1,j,newSi,sj});queue.offer(new int[]{i,j+1,si,newSj});}return res;}
}

时间复杂度:O(mn)O(mn)O(mn)

空间复杂度:O(mn)O(mn)O(mn)

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...