描述

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。

例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。
请问该机器人能够到达多少个格子?

示例

示例 1:
输入:m = 2, n = 3, k = 1
输出:3

示例 2:
输入:m = 3, n = 1, k = 0
输出:1

思路

此题和12题类似,是一个矩阵搜索问题,很容易想到利用 BFS 或 DFS 策略进行搜索。本题的搜索条件是数位之和小于 k且是联通的,且需要记录所有满足条件的格子数。

可以使用递归实现DFS搜索,由于本题矩阵中满足数位和的解构成的几何形状形是多等腰直角三角形,每个三角形的直角顶点位于
0, 10, 20, …0,10,20,… 等数位和突变的矩阵索引处 。三角形内的解虽然都满足数位和要求,但由于机器人每步只能走一个单元格,
而三角形间不一定是连通的,因此机器人不一定能到达,称之为 不可达解 ;同理,可到达的解称为可达解 (本题求此解) 。
根据可达解的结构和连通性,易推出机器人可 仅通过向右和向下移动,访问所有可达解。因此,本地DFS可以之搜索向下、向右两个方向。

求数位之和有一个通用的方法:利用%10取整数的最低位,再利用/10将十进制数右移,不断累加最低位的值直到数为0为止。但本题有一个更优秀的策略,由于机器人每次只能移动一格,因此数位每次递增1,此外,行坐标或列坐标发生进位时,数位之和总是要减去8,利用这个特点便可以计算机器人移动到的格子的数位之和。

如果使用DFS策略,利用递归回溯很容易计算出所有满足条件的格子总数,但如果使用BFS,那么只能设置一个全局变量来记录各自总数。

代码

// DFS
class Solution {int m,n,k;boolean[][] board = null;public int movingCount(int m, int n, int k) {this.m = m;this.n = n;this.k = k;board = new boolean[m][n];return dfs(0, 0, 0, 0);}private int dfs(int i, int j, int si, int sj) {// 如果发生越界、当前格子已访问过、不满足搜索条件(数位之和大于k),则当前格子不作数,返回0if (i < 0 || i > m - 1 || j < 0 || j > n - 1 || board[i][j] || si + sj > k) return 0;// 否则,将当前格子标记为已访问过,并继续往右、往下搜索board[i][j] = true;return 1 + dfs(i + 1, j, (i + 1) % 10 == 0 ? si - 8 : si + 1, sj) + dfs(i, j + 1, si, (j + 1) % 10 == 0 ? sj - 8 : sj + 1);}
}
// BFS
class Solution {public int movingCount(int m, int n, int k) {int sum = 0;boolean[][] board = new boolean[m][n];Queue<int[]> queue = new LinkedList<>();queue.add(new int[]{0,0,0,0});while (!queue.isEmpty()) {int[] pos = queue.poll();if (pos[0] < 0 || pos[0] > m - 1 || pos[1] < 0 || pos[1] > n -1 || pos[2] + pos[3] > k || board[pos[0]][pos[1]]) continue;board[pos[0]][pos[1]] = true;sum++;int si = (pos[0] + 1) % 10 == 0 ? pos[2] - 8 : pos[2] + 1;int sj = (pos[1] + 1) % 10 == 0 ? pos[3] - 8 : pos[3] + 1;queue.add(new int[]{pos[0] + 1, pos[1], si, pos[3]});queue.add(new int[]{pos[0], pos[1] + 1, pos[2], sj});}return sum;}
}

12. 机器人的运动范围相关推荐

  1. Rviz中控制机器人模型运动(arbotix)

    前言: 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模型的运动呢?在此,可以调用 Arbotix 实现此功能. 简介: Arbotix:Arboti ...

  2. JZ13 机器人的运动范围

    JZ13 机器人的运动范围 描述 地上有一个 rows 行和 cols 列的方格.坐标从 [0,0] 到 [rows-1,cols-1] .一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左 ...

  3. 剑指offer:面试题13. 机器人的运动范围

    题目:机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动到方格外 ...

  4. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...

  5. LeetCode-剑指 Offer 13. 机器人的运动范围

    剑指 Offer 13. 机器人的运动范围 思路一:利用dfs深度优先搜索 首先确定递归搜索的终止条件 1:i,j超出范围 2:数位之和大于k 3:(i,j)被访问过 接下来进行dfs 可以进行一个d ...

  6. 《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围

    一.矩阵中的路径 1.题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. ...

  7. 【四重优化,速看】剑指 Offer 13. 机器人的运动范围

    立志用最少的代码做最高效的表达 题目 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不 ...

  8. LeetCode 面试题13. 机器人的运动范围

    我的LeetCode:https://leetcode-cn.com/u/ituring/ 我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Alg ...

  9. 【LeetCode】剑指 Offer 13. 机器人的运动范围

    [LeetCode]剑指 Offer 13. 机器人的运动范围 文章目录 [LeetCode]剑指 Offer 13. 机器人的运动范围 package offer;public class Solu ...

最新文章

  1. ASP .NET Core Web Razor Pages系列教程四:使用数据库进行交互 entity-framework(MySQL/MariaDB 版)
  2. XpShop v2.2发布,免费下载
  3. Windows彻底卸载删除MySQL
  4. Java要怎么入门?初学者要怎么学?
  5. mysql const ref_mysql explain详解
  6. 【HTML】中国天气天气插件调用
  7. orm2 中文文档 3.3 模型钩子
  8. THREEJS - 点击/拾取
  9. LIRe 源代码分析 1:整体结构
  10. axure如何导出原件_彻底抛弃WORD!教你用Axure快速输出高质量的PRD
  11. HFSS天线设计过程学习笔记
  12. VMware vSphere Client虚拟化重装虚拟机系统步骤
  13. 华为Ensp常用命令
  14. Supervised Sequence Labelling with Recurrent Neural Networks 笔记 -LSTM
  15. Duplicate showFileChooser result
  16. 笔记 GWAS 操作流程5-2:利用GEMMA软件进行LMM+PCA+协变量
  17. oracle erp 架构,Oracle ERP (EBS)基础篇-体系架构
  18. Android 8.0 开机动画,RK3326 android10.0(Q) 开机logo+开关机动画替换
  19. [再寄小读者之数学篇](2014-06-20 Beta 函数)
  20. JVM_虚拟机执行子系统

热门文章

  1. ntlm java_Java HTTP NTLM实现差异
  2. 算命程序源码 实现一对多的网络算命发展趋势 python编写的,测算的精准度 页面的布局 欢迎业内人士指导改进
  3. 数据结构(顺序表):学生管理系统的设计与实现(C语言)
  4. shell 拼接换行字符串_Linux中shell字符串分隔、字符串替换、字符串拼接
  5. 共赢全屋智能X全屋定制新风口 立林与尚品宅配达成战略合作
  6. 欢迎制造业同行加入非商业联合开发俱乐部群106930856
  7. matlab视觉呈现任务,视觉笔记 | 国内外优秀作品解读赏析(1)
  8. 【Java生态圈技术总结】之深度剖析MapStruct对象拷贝工具
  9. ChrisRenke/DrawerArrowDrawable源码解析
  10. java+脚本+压枪,csgo自动压枪脚本捷径 js